流星项目我在满足某些条件时正在处理上传文件。无论文件是否上传,都必须在if语句完成后制作Meteor.call。由于条件,当我使用回调时,它会导致很多重复的代码。如下所示,我希望在执行uploadFile回调之前可以执行Meteor.call,这将是一个问题。
var data = {
name: "..."
//...
}
if(condition){
uploadFile(parameters, function(error,result){
if(err) handleError(err);
else data.url1 = result.secure_url;
}
if(condition2){
uploadFile(parameters, function(error,result){
if(err) handleError(err);
else data.url2 = result.secure_url;
}
/* This Meteor.call needs to wait until both if statements above
have completed */
Meteor.call('insertData', data, function(error,result){
//...
}
答案 0 :(得分:0)
你可以移除条件,而是实现Javascript Promises
他们很有趣和喜欢他们消除回调地狱并提供可读的自上而下格式:
http://jsfiddle.net/4v29u4do/1/
这个小提示显示了如何使用promises等待异步回调而不是条件if语句
通过承诺,你可以return
作为来自承诺的回调的新承诺,并继续前进和回调将被传递给新的.then
,直到你完成,如果那里是一路上的任何错误,它会直接跳到.catch
。
function uploadFile(file) {
return new Promise(function(resolve, reject) {
// Simulate ASYNC Call for Uploading File
setTimeout(function() {
console.log(file + ' Uploaded Successfully!');
return resolve(file);
// if (err) {
// return reject(err);
// }
}, 3000);
});
}
var data = {};
uploadFile("filename1")
.then(function(cb) {
data.url1 = cb;
return uploadFile("filename2");
})
.then(function(cb) {
data.url2 = cb;
return uploadFile("filename5");
})
.then(function(cb) {
data.url3 = cb;
console.log(data);
//all done with callbacks
// Meteor.call("");
})
.catch(function(err) {
// One of the uploads failed log the err;
});