有没有办法在 Promises 的 .then 部分传递自定义数据?
Is there a way to pass custom data in .then part of Promises?
我对 promises 真的很陌生(我在 expressjs 中使用 bluebird promises)。我喜欢他们整理代码的方式。但是,我不太确定在某些情况下如何使用它们。我什至不确定我在示例中是否正确使用了它们。
我遇到的问题是我想将一些真值或假值传递给承诺的“.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);
});
I'm not even sure I'm using them right in my example.
您似乎忘记了 return
来自 each()
回调的承诺。另外,我不确定你是否需要那个 Promise.try
包装器,我认为直接使用 .fetch()
返回的承诺应该是非常安全的。
The issue I have is that I'd like to pass some truthy or falsy to ".then" part of the promise.
我认为这里最简单的方法是嵌套 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
表达式,请参阅 了解其他方法。
其实很容易。其中一种方法是将状态添加到周围的函数中(在您的情况下,我认为这将完全满足您的需求)。
//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);
});
我对 promises 真的很陌生(我在 expressjs 中使用 bluebird promises)。我喜欢他们整理代码的方式。但是,我不太确定在某些情况下如何使用它们。我什至不确定我在示例中是否正确使用了它们。
我遇到的问题是我想将一些真值或假值传递给承诺的“.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);
});
I'm not even sure I'm using them right in my example.
您似乎忘记了 return
来自 each()
回调的承诺。另外,我不确定你是否需要那个 Promise.try
包装器,我认为直接使用 .fetch()
返回的承诺应该是非常安全的。
The issue I have is that I'd like to pass some truthy or falsy to ".then" part of the promise.
我认为这里最简单的方法是嵌套 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
表达式,请参阅
其实很容易。其中一种方法是将状态添加到周围的函数中(在您的情况下,我认为这将完全满足您的需求)。
//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);
});