javascript - 使用 Node Bluebird 。 API返回信息太晚

标签 javascript node.js bluebird

我正在尝试找出如何在“hhh”结果中不出现未定义的情况。发生的情况是 jjj 作为 hello 返回,然后我的结果未定义,然后“here”返回所有 api 数据。看来 api 需要很长时间才能返回,所以它给了我未定义的信息。发生这种情况时,我无法使用这些数据来更新我的表单。有什么建议么?

var myresult;
soap.createClient(url, function(err, client) {
   client.getShipQuote(args, function(err, result) {
     if (err) {
       console.log(err.message);
     }
     console.log('RESPONSE BODY:');
     console.log("here", result.return.shipQuote[0].chargesCollection);
     myresult = result.return.shipQuote[0].chargesCollection;
});


});
var x="hello";
bluebird.all([x, myresult])
.spread(function(x, myresult){
  console.log("jjj", x);
  console.log("hhh", myresult);
  response.send(x);
});

最佳答案

首先,Bluebird 是一个“ promise ”库。这意味着它根据 promise 创造和运作。要将其与异步操作一起使用,您必须有一个返回 Promise 的异步操作,而不是需要常规回调的异步操作。通常,如果您开始的异步操作不返回 promise ,那么您可以通过创建一个新版本来“ promise ”它,该版本使用它支持的回调来驱动 promise 。然后,您可以通过该功能的新 promise 版本来使用 Bluebird 的所有功能。

Bluebird 本身没有任何魔力来知道异步操作何时完成。而且,它没有能力使异步操作看起来是同步的。它提供了用于管理和协调异步操作的工具,以便您可以知道它们何时完成、结果何时可用以及是否/何时出现错误。

您似乎有两个异步操作,一个位于另一个 soap.createClient() 内,另一个位于 client.getShipQuote() 内。而且,看起来您想要对它们进行排序,以便调用第一个,将结果传递给第二个,然后在其他代码中,您可以使用最终结果。以下是我建议如何使用 Promise 来做到这一点:

const Promise = require('bluebird');

// make promisified versions of soap methods
// only have to do this once
Promise.promisifyAll(soap);

// call promisified version
soap.createClientAsync(url).then(client => {
    // could perhaps do this only once beforehand if you know how to reach the client.prototype object
    // before a client object is created - requires knowing a little about how the library is structured
    Promise.promisifyAll(client);
    return client.getShipQuoteAsync(args);
}).then(result => {
    // handle final result here
    response.send(...);
}).catch(err => {
    // handle error here - this will catch all prior errors
    console.log(err);
    response.status(500).send(...);
});

如果您只想通过普通的回调编程(没有 promise )来做到这一点,那么您可以这样做:

soap.createClient(url, function(err, client) {
    if (err) {
        console.log(err.message);
        // send error response
        response.status(500).send(...);
    } else {
        client.getShipQuote(args, function(err, result) {
            if (err) {
                console.log(err.message);
                // send error response
                response.status(500).send(...);
            } else {
                let myResult = result.return.shipQuote[0].chargesCollection;
                // send response here
                response.send(...);
            }
        }
    }
});

请注意,在异步编程的所有情况下,您都必须在提供结果的回调中使用结果(或在从那里调用的函数中)。您不能只是将结果填充到更高作用域的变量中,然后在回调之外的代码中使用它,因为当该值可用时,您的计时将不正确。这就是为什么您的代码中出现 undefined 的原因,因为您的代码在异步操作完成之前和设置值之前正在检查变量。只有在完成回调中你才能真正知道该值可用。 promise 并不能改变这个事实。它们只是让您更轻松地管理和协调回调。

关于javascript - 使用 Node Bluebird 。 API返回信息太晚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45221330/

相关文章:

javascript - 在 ul li 中滚动行为异常

javascript - Backbone.js 和 Browserify - 多次需要相同的模块

javascript - 使用 HTML 和 JavaScript 确认方法

node.js - express.js 中的路由器优先顺序

node.js - 使用 node-xmpp ( node.js ) 注册新的 xmpp 帐户

javascript - `Q.when` 的 Bluebird 等价物是什么?

javascript - 在特定 div 中打开脚本。不是整个窗口

javascript - Stripe 充电未通过

typescript - typescript 中的 Bluebird 和 es6 promises

javascript - 如何拥有可变数量的 Bluebird promise ? ( Node )