Javascript NodeJs按顺序调用模块
我对Nodejs很陌生,有Java背景。我为这个冗长的问题道歉。我正在开发一个独立的Nodejs应用程序,它必须按顺序执行步骤。以下是步骤: 步骤1:应用程序必须调用external-server-A,否则重试 步骤2:一旦上述调用成功,它必须调用 external-server-b,在步骤1上获取响应,否则重试 步骤3:一旦上述调用成功,它必须调用本地模块 通过获取步骤2的响应并调用函数 为了不将所有步骤合并到1 JS页面中,我想在不同的JS页面中编写与上述步骤相关的函数,并通过require()导入它们。我不知道如何按顺序给他们打电话。 我应该在step1函数和step2函数的回调代码块中有Javascript NodeJs按顺序调用模块,javascript,node.js,Javascript,Node.js,我对Nodejs很陌生,有Java背景。我为这个冗长的问题道歉。我正在开发一个独立的Nodejs应用程序,它必须按顺序执行步骤。以下是步骤: 步骤1:应用程序必须调用external-server-A,否则重试 步骤2:一旦上述调用成功,它必须调用 external-server-b,在步骤1上获取响应,否则重试 步骤3:一旦上述调用成功,它必须调用本地模块 通过获取步骤2的响应并调用函数 为了不将所有步骤合并到1 JS页面中,我想在不同的JS页面中编写与上述步骤相关的函数,并通过require
require(./step2)
,require(./step3)
提前感谢您的帮助。您需要在页面顶部显示步骤2和步骤3,但可以将它们作为一个函数公开,稍后再执行。您还可以使用来帮助您编写异步代码。例如:
// Step one
const step2 = require('./step2');
const step3 = require('./step3');
function someAsyncCallToExternalServerA() {
/*
Return a promise here which resolves to when
your call to external server A call is successful
*/
}
someAsyncCallToExternalServerA()
.then(function(serverAResults) { // I don't know if you need the serverA results or not
// This will pass the results from the step2 success to the step3 function
return step2.then(step3);
})
.then(function() {
console.log('All done!');
})
.catch(function(err) {
console.log('Failed: ', err);
})
您将需要在页面顶部显示step2和step3,但可以将它们作为一个函数公开,稍后再执行。您还可以使用来帮助您编写异步代码。例如:
// Step one
const step2 = require('./step2');
const step3 = require('./step3');
function someAsyncCallToExternalServerA() {
/*
Return a promise here which resolves to when
your call to external server A call is successful
*/
}
someAsyncCallToExternalServerA()
.then(function(serverAResults) { // I don't know if you need the serverA results or not
// This will pass the results from the step2 success to the step3 function
return step2.then(step3);
})
.then(function() {
console.log('All done!');
})
.catch(function(err) {
console.log('Failed: ', err);
})
一种方法是在需要时使用各种回调来触发所需内容 设想两个步骤:
function step1(onSuccess, onError) {
iDoSomethingAsync(function (err) {
if (err) onError()
else onSuccess()
}
}
function step2(onSuccess, onError) {
iDoSomethingElseAsync(function (err) {
if (err) onError()
else onSuccess()
}
}
然后,您可以像这样简单地链接调用:
step1(step2, step1)
步骤1被调用,dosomething,如果某物没有返回错误,它将调用步骤2。如果我们出错,它将再次调用step1
在异步编程中,您必须理解,当调用someFunc(回调)时,someFunc在下一行中没有完成他的工作。但是调用callback时somefunc将完成他的工作
这取决于您对回调做任何您想做的事情,因为您可以保证函数已经完成了他的工作(或出错)
返回step1/step2示例,这里是相同的函数,在出现错误时以1秒延迟回调step1:
step1(step2, setTimeout.bind(this, step1, 1000))
一旦你用正确的方式思考,事情就很简单了,不是吗?如果你来自java,就认为它是lambda、任务和期货/承诺之间的混合。
另外,正如另一个答案所指出的,使用像promise这样的库可以帮助您编写更干净的代码(我建议使用它,因为我的示例一点也不干净),但您仍然需要了解一切是如何工作的。一种方法是在需要时使用各种回调来触发所需的内容 设想两个步骤:
function step1(onSuccess, onError) {
iDoSomethingAsync(function (err) {
if (err) onError()
else onSuccess()
}
}
function step2(onSuccess, onError) {
iDoSomethingElseAsync(function (err) {
if (err) onError()
else onSuccess()
}
}
然后,您可以像这样简单地链接调用:
step1(step2, step1)
步骤1被调用,dosomething,如果某物没有返回错误,它将调用步骤2。如果我们出错,它将再次调用step1
在异步编程中,您必须理解,当调用someFunc(回调)时,someFunc在下一行中没有完成他的工作。但是调用callback时somefunc将完成他的工作
这取决于您对回调做任何您想做的事情,因为您可以保证函数已经完成了他的工作(或出错)
返回step1/step2示例,这里是相同的函数,在出现错误时以1秒延迟回调step1:
step1(step2, setTimeout.bind(this, step1, 1000))
一旦你用正确的方式思考,事情就很简单了,不是吗?如果你来自java,就认为它是lambda、任务和期货/承诺之间的混合。
另外,正如另一个答案所指出的,使用像promise这样的库可以帮助您编写更干净的代码(我建议使用它,因为我的示例一点也不干净),但您仍然需要了解每件事情是如何工作的。感谢您的详细解释,它确实很有帮助。还有关于链接调用和设置重试机制。非常感谢您提供的信息。感谢您的详细解释,这真的很有帮助。还有关于链接调用和设置重试机制。安德鲁·莱弗利:谢谢你的信息。我会读更多关于承诺的书。对于承诺重试,最好的方法是什么。@John我建议您查看这个问题以重试承诺:如果我必须从app.js文件调用这些步骤,并且步骤1的响应必须传递到步骤2,那么我如何才能做到这一点。Andrew Lively:谢谢您提供的信息。我会读更多关于承诺的书。对于承诺重试,最好的方法是什么。@John我建议检查一下这个问题来重试承诺:如果我必须从app.js文件调用这些步骤,并且步骤1的响应必须传递到步骤2,那么我如何才能做到这一点。