有没有办法在。然后部分Promises中传递自定义数据?

时间:2015-03-08 11:48:33

标签: javascript promise bluebird bookshelf.js

我很擅长承诺(我使用bluejs承诺与expressjs)。我喜欢他们整理代码的方式。但是,我不太确定在某些情况下如何使用它们。我甚至不确定我是否在我的例子中使用它们。

我遇到的问题是,我想将一些真实或虚假的东西传递给"然后#34;承诺的一部分。我已经对下面的代码进行了评论,以获取更多详细信息。

提前谢谢!

//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);
});

2 个答案:

答案 0 :(得分:1)

  

我甚至不确定我是否在我的例子中使用它们。

您似乎已忘记return来自each()回调的承诺。此外,我不确定您是否需要Promise.try包装,我认为使用.fetch()直接返回的承诺应该非常安全。

  

我遇到的问题是,我想将一些真实或虚假的东西传递给"然后#34;承诺的一部分。

我认为最简单的方法是嵌套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表达式,请参阅How do I access previous promise results in a .then() chain?了解其他方法。

答案 1 :(得分:0)

实际上,这很容易。其中一种方法是将状态添加到周围的功能中(在您的情况下,我认为完全符合您的需求)。

//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);
});