使函数按顺序运行[Node JS]

时间:2016-04-29 01:27:52

标签: javascript node.js express

我有这两个功能,一个在另一个内部运行,第二个是使用fisrt one(list)的输出。

我想要的是按顺序运行。你能帮忙吗?

gm_scrape.search_link(request, function(list){
    gm_scrape.fetch_profiles(list, function(profiles, request){
        console.log("the profil is "+profiles);
     });
});

感谢您的帮助!

2 个答案:

答案 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的结果的任务,其中回调将是混乱的,很难管理。如果您的模块无法使用承诺,并且您不想花时间包装它,那么这也可能是一个更简单的解决方案(因为这些回调会破坏大多数承诺模块提供的帮助程序)。