0

私はpromiseに本当に慣れていません(expressjsでbluebirdのpromiseを使用しています)。彼らがコードを整理する方法が好きです。ただし、いくつかのシナリオでそれらを使用する方法がよくわかりません。私の例でそれらを正しく使用しているかどうかさえわかりません。

私が抱えている問題は、約束の「.then」部分に真実または偽りを渡したいということです。詳細については、以下のコードにコメントしました。

前もって感謝します!

//data is an array of javascript objects
Promise.each(data, function(d){
    delete d.offset;
    if (d.driver_id == -1) d.driver_id = null;  

    Promise.try(function(){
        return new Term().where({'date_of_driving': d.date_of_driving}).fetch()
    })
    .then(function(result){

        d.updated_at = dater.formatDate(new Date(), true);
        if (result !== null) {
            //update
            var res = result.toJSON();
            return new Term({'id': res.id}).save(d);
        } else {
            //save
            d.created_at = dater.formatDate(new Date(), true);
            return new Term().save(d);               
        }
    }).then(function(item){
            //I need to know here if before I saved or updated Term record
            //is there a way to pass a truthy or falsy variable?
    })
})
.then(function(terms){

})
.catch(function(error){
    callback(false);
});
4

2 に答える 2

1

私の例でそれらを正しく使用しているかどうかさえわかりません。

コールバックreturnからの約束を忘れているようです。また、そのラッパーeach()が必要かどうかはわかりませんが、返されたプロミスを直接使用することはかなり安全だと思います。Promise.try.fetch()

私が抱えている問題は、約束の「.then」部分に真実または偽りを渡したいということです。

thenここでの最も簡単な方法は、呼び出しをネストし、コールバックをそれぞれの呼び出しに合わせて配置することだと思い.save()ます。

return new Term().where({'date_of_driving': d.date_of_driving}).fetch()
.then(function(result){
    d.updated_at = dater.formatDate(new Date(), true);
    if (result !== null) {
        var res = result.toJSON();
        return new Term({'id': res.id}).save(d) // update
        .then(function(item) {
            // here you know that before you updated the Term record
        });
    } else {
        d.created_at = dater.formatDate(new Date(), true);
        return new Term().save(d) // save
        .then(function(item) {
            // here you know that before you saved the Term record
        });
    }
})

基本的に、問題がresult !== null式へのアクセスに要約される場合は、.then() チェーンで前のプロミス結果にアクセスするにはどうすればよいですか? を参照してください。他のアプローチのために。

于 2015-03-08T13:32:28.920 に答える
0

それは実際には非常に簡単です。方法の1つは、状態を周囲の関数に追加することです(あなたの場合、これはあなたのニーズに完全に合うと思います)。

//data is an array of javascript objects
Promise.each(data, function(d){
    var updated; // state var
    delete d.offset;
    if (d.driver_id == -1) d.driver_id = null;  

    return Promise.try(function(){
        return new Term().where({'date_of_driving': d.date_of_driving}).fetch()
    })
    .then(function(result){

        d.updated_at = dater.formatDate(new Date(), true);
        if (result !== null) {
            //update
            updated = true;
            var res = result.toJSON();
            return new Term({'id': res.id}).save(d);
        } else {
            updated = false;
            //save
            d.created_at = dater.formatDate(new Date(), true);
            return new Term().save(d);               
        }
    }).then(function(item){
            // Here, you can use the updated variable.
    })
})
.then(function(terms){

})
.catch(function(error){
    callback(false);
});
于 2015-03-08T13:33:58.527 に答える