如何 return 来自包含承诺链的常规 javascript 函数的值?
How to return a value from a regular javascript function that contains a promise chain?
function bsfir() {
Parse.Promise.as().then(function() {
return Parse.Cloud.run('gRFI', {});
}).then(function(gRFIr) {
return Parse.Cloud.run('gFI', { });
}).then(function(gFIR) {
return gFIR;
}, function(error) {
return error;
});
}
Parse.Cloud.define("bSFI", function(request, response) {
Parse.Promise.as().then(function() {
return bsfir();
}).then(function(bsfirr) {
response.success(bsfirr);
}, function(error) {
response.error("219 error: " + JSON.stringify( error));
});
});
目标是 bsfir()
在将执行交还给调用者之前完成执行(即 resolve the promise),在本例中为 bSFI()
。
调用 bSFI()
结果只执行 bsfir()
中的几行代码。 bSFI()
的执行几乎 immediately/instantaneously 可能是因为 bsfir()
中的承诺没有绑定到 return 值,所以当 bSFI()
调用 bsfir()
, 立即执行到 response.success(bsfirr);
在 bsfir()
中使用 Promise.all()
是一个好的解决方案吗?
不,您不能等到 promise 在您 return 之前解决。您的任务是异步的,但 return
必须立即发生。
但是您可以做的只是 return 承诺(来自您的)本身,并让您的调用者等待它。事实上,您的 bSFI()
已经使用了 promise,因此集成起来很简单。
function bsfir() {
return Parse.Promise.as().then(function() {
// ^^^^^^
return Parse.Cloud.run('gRFI', {});
}).then(function(gRFIr) {
return Parse.Cloud.run('gFI', {});
});
}
Parse.Cloud.define("bSFI", function(request, response) {
Parse.Promise.as().then(bsfir).then(function(bsfirr) {
response.success(bsfirr);
}, function(error) {
response.error("219 error: " + JSON.stringify( error));
});
});
请注意,您应该能够在两个函数中将 Parse.Promise.as().then(…)
替换为 …()
。
function bsfir() {
Parse.Promise.as().then(function() {
return Parse.Cloud.run('gRFI', {});
}).then(function(gRFIr) {
return Parse.Cloud.run('gFI', { });
}).then(function(gFIR) {
return gFIR;
}, function(error) {
return error;
});
}
Parse.Cloud.define("bSFI", function(request, response) {
Parse.Promise.as().then(function() {
return bsfir();
}).then(function(bsfirr) {
response.success(bsfirr);
}, function(error) {
response.error("219 error: " + JSON.stringify( error));
});
});
目标是 bsfir()
在将执行交还给调用者之前完成执行(即 resolve the promise),在本例中为 bSFI()
。
调用 bSFI()
结果只执行 bsfir()
中的几行代码。 bSFI()
的执行几乎 immediately/instantaneously 可能是因为 bsfir()
中的承诺没有绑定到 return 值,所以当 bSFI()
调用 bsfir()
, 立即执行到 response.success(bsfirr);
在 bsfir()
中使用 Promise.all()
是一个好的解决方案吗?
不,您不能等到 promise 在您 return 之前解决。您的任务是异步的,但 return
必须立即发生。
但是您可以做的只是 return 承诺(来自您的)本身,并让您的调用者等待它。事实上,您的 bSFI()
已经使用了 promise,因此集成起来很简单。
function bsfir() {
return Parse.Promise.as().then(function() {
// ^^^^^^
return Parse.Cloud.run('gRFI', {});
}).then(function(gRFIr) {
return Parse.Cloud.run('gFI', {});
});
}
Parse.Cloud.define("bSFI", function(request, response) {
Parse.Promise.as().then(bsfir).then(function(bsfirr) {
response.success(bsfirr);
}, function(error) {
response.error("219 error: " + JSON.stringify( error));
});
});
请注意,您应该能够在两个函数中将 Parse.Promise.as().then(…)
替换为 …()
。