我有这两个功能,一个在另一个内部运行,第二个是使用fisrt one(list)的输出。
我想要的是按顺序运行。你能帮忙吗?
gm_scrape.search_link(request, function(list){
gm_scrape.fetch_profiles(list, function(profiles, request){
console.log("the profil is "+profiles);
});
});
感谢您的帮助!
答案 0 :(得分:0)
更好的方法是使用Promises
gm_scrape.search_link(request).then(function(list){
return gm_scrape.fetch_profiles(list);
}).then(function(profiles){
console.log("the profil is "+profiles);
}).catch(function(err){ console.warn(err); });
gm_scrape.search_link = function(request){
return new Promise(function(resolve, reject){
// async call...
.onsuccess: resolve(list)
.onfailure: reject(err)
})
}
gm_scrape.fetch_profiles = function(list){
return new Promise(function(resolve, reject){
// async call...
.onsuccess: resolve(profiles)
.onfailure: reject(err)
})
}
对不起,我有点可读性的缩写。这是一个带有ajax调用的Promise的例子
gm_scrape.search_link = function(req){
return new Promise(function(resolve, reject){
$http({
method: 'POST',
url: req.url,
data: req.data
}).success(function successCallback(list) {
console.log(list);
resolve(list);
}).error(function(error) {
console.log(error);
reject(error);
});
})
}
答案 1 :(得分:0)
虽然您在问题中提供的示例(如jfriend00的评论所暗示的)正在按顺序运行。如果你想避免死亡的金字塔"承诺是一种很好的方式,按照" Steven Kaspar"的建议。
然而,还有其他常见的方法可以做同样的事情。解决这个问题的另一种常见方法是使用caolan/async's瀑布法:
async.waterfall([
function(callback) {
gm_scrape.search_link(request, function(list){
callback(null, list);
});
},
function(callback) {
gm_scrape.fetch_profiles(list, function(profiles, request){
callback(null, profiles);
});
}
], function(err, result) {
console.log("the profile is ", result);
});
但是,除非您嵌入了3-4个回调,否则这可能没有意义。 Promise可能是一个更好的设计模式,因为这个解决方案更适合现有的代码库而没有承诺,你需要一种方法来组织一系列依赖于last的结果的任务,其中回调将是混乱的,很难管理。如果您的模块无法使用承诺,并且您不想花时间包装它,那么这也可能是一个更简单的解决方案(因为这些回调会破坏大多数承诺模块提供的帮助程序)。