使函数按顺序运行[Node JS]
Make a functions run in sequence [Node JS]
我有这两个函数,一个在另一个内部运行,第二个使用第一个(列表)的输出。
我想要的是按顺序运行。你能帮忙吗?
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)
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- 如何使用 node.js 比较两个 json 数组
- Node.js's Buffer.writeFloatBE in Javascript
- node.js:setInterval()正在跳过调用
- 如何处理node.js节点mongodb中的连接和查询队列
- Node.js正在更改应用程序以使用集群模块
- 如何使用Node.js最有效地解析网页
- 在openshift node js应用程序中获取请求
- 正在删除node.js中已验证的网站
- 与运行长作业(javascript,node.js)的第三方API同步的最佳实践
- 在索引.html和应用.js [node.js] 之间共享变量
- Node.js中的JavaScript原型对象效率
- node.js请求数据事件未在CORS ajax调用中触发
- 使用node.js制作网站
- 使用node.js服务器中的evernote api获取note内容
- 有没有任何方法可以使用node-js从不同的机器打开浏览器
- 使用CI和CodeDeploy对node.js应用程序进行连续部署
- 在Node.js中上传和检索图像
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 如何使用 Node JS 获取 JSON 嵌套数组值