我很难学会如何使用我能找到的信息来避免延迟反事工。我正在使用Q库来创建Nodejs。
由于可以阅读,基本上,我们试图不拒绝或回答deferred.reject或deferred.resolve的承诺。
deferred.resolve必须被一个返回句替换,所以这一点非常简单。
当我想在一个函数中使用一个promise时会出现问题,这个函数必须在某些不应用程序错误的情况下拒绝执行。例如:
Services.data.isNotForbiddenFieldToUpdate(bodyKeys,forbidden)
.then(() => console.log('Finish'))
其中
isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => {
var deferred = Q.defer();
//DO A QUERY AND STORE IN result PARAM
if(err) deferred.reject(err)
else if(! result) deferred.reject(new Error('Query is empty.'));
else deferred,resolve();
return deferred.promise;
}
在这种情况下,无法返回与deferred.promise不同的内容。如果我删除它并返回true,则错误是then
未知。
如果可能的话,如何在不使用延迟的情况下管理这种代码?感谢。
答案 0 :(得分:0)
isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) => {
var deferred = Q.defer();
//DO A QUERY AND STORE IN result PARAM
此时,假设“QUERY”是异步操作,您将获得一个承诺。因此,您可能不需要创建另一个承诺,只需重复使用来自“QUERY”的承诺。
return yourAsyncQuery();
或者,如果你需要在“QUERY”的结果中添加内容,那么你必须给它一个回调来在它完成时执行。在回调中,您解决或拒绝承诺(Q
)。
yourAsyncQuery().then(
function(result) {
if (! result)
deferred.reject(new Error('Query is empty.'));
// do more stuff with 'result'.
deferred.resolve(result);
},
function(error) {
deferred.reject(error);
}
);
return deferred.promise;
}
答案 1 :(得分:0)
我不知道Q是怎样的,但是你可以按照以下原则做出本机承诺:
isNotForbiddenFieldToUpdate: (fieldsToUpdate,forbiddenFields) =>
new Promise((resolve, reject) => {
//DO A QUERY AND STORE IN result PARAM
if(err){
reject(err);
} else if(! result){
reject(new Error('Query is empty.'));
} else {
resolve();
}
}
我猜Q应该是相似的。无论如何,除非你需要一个非常具体的Q功能,否则我宁愿使用本机Promise。