Javascript NodeJs按顺序调用模块

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

我对Nodejs很陌生,有Java背景。我为这个冗长的问题道歉。我正在开发一个独立的Nodejs应用程序,它必须按顺序执行步骤。以下是步骤:

步骤1:应用程序必须调用external-server-A,否则重试

步骤2:一旦上述调用成功,它必须调用 external-server-b,在步骤1上获取响应,否则重试

步骤3:一旦上述调用成功,它必须调用本地模块 通过获取步骤2的响应并调用函数

为了不将所有步骤合并到1 JS页面中,我想在不同的JS页面中编写与上述步骤相关的函数,并通过require()导入它们。我不知道如何按顺序给他们打电话。 我应该在step1函数和step2函数的回调代码块中有
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,那么我如何才能做到这一点。