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

Make a functions run in sequence [Node JS]

本文关键字:Node JS 运行 函数 顺序      更新时间:2023-09-26

我有这两个函数,一个在另一个内部运行,第二个使用第一个(列表)的输出。

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

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

谢谢你的帮助!

更好的方法是使用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);
        });
    })
}

您在问题中提供的示例(正如jfriend00的注释所暗示的那样)正在按顺序运行。如果你想避免"死亡金字塔",正如"史蒂文·卡斯帕"所建议的那样,承诺是一个很好的方法。

然而,做同样的事情还有其他常见的方法。解决这一问题的另一种常见方法是使用caolan/async的瀑布方法:

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个回调。Promises可能是一种更好的设计模式,因为这个解决方案更适合现有的代码库,而没有Promises,你需要一种方法来组织一系列依赖于最后一个结果的任务,而回调会很混乱,很难管理。如果promise不适用于您的模块,并且您不想花时间包装它,那么这可能也是一个更容易的解决方案(因为这些回调会破坏大多数promise模块提供的promisify助手)。

我知道这个问题很老了,但我想补充一点,你可以使用一个简单的回调函数来解决这个问题。

一个非常简单的例子:

function first(next = null) {
  console.log('First')
  if (next) {
    next()
  }
}
function second() {
    console.log('Second')
}
first(second)