gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:49:43 25 4
gpt4 key购买 nike

我正在尝试找出如何在“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com