我还在为承诺而挣扎,但多亏了这里的社区,我取得了一些进展。
我有一个简单的JS函数查询解析数据库。它应该返回结果数组,但显然由于查询的异步性质(因此承诺),函数在结果之前返回,留给我一个未定义的数组。
我需要做什么来让这个函数等待承诺的结果?
这是我的代码:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
var promise = query.find({
success: function(results) {
// results is an array of Parse.Object.
console.log(results);
//resultsArray = results;
return results;
},
error: function(error) {
// error is an instance of Parse.Error.
console.log("Error");
}
});
}
而不是返回resultsArray,而是返回一个结果数组的承诺,然后在调用站点上返回结果数组——这有一个额外的好处,即调用者知道函数正在执行异步I/O。在JavaScript中编写并发代码就是基于这一点——你可能想要阅读这个问题来获得更广泛的想法:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
return query.find({});
}
// later
resultsByName("Some Name").then(function(results){
// access results here by chaining to the returned promise
});
你可以在parse自己的博客文章中看到更多使用parse承诺和查询的例子。
而不是返回resultsArray,而是返回一个结果数组的承诺,然后在调用站点上返回结果数组——这有一个额外的好处,即调用者知道函数正在执行异步I/O。在JavaScript中编写并发代码就是基于这一点——你可能想要阅读这个问题来获得更广泛的想法:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
return query.find({});
}
// later
resultsByName("Some Name").then(function(results){
// access results here by chaining to the returned promise
});
你可以在parse自己的博客文章中看到更多使用parse承诺和查询的例子。
你在这里没有使用承诺。Parse允许你使用回调或承诺;你的选择。
要使用承诺,请执行以下步骤:
query.find().then(function() {
console.log("success!");
}, function() {
console.log("error");
});
现在,要在promise完成后执行一些东西,你可以在then()调用的promise回调中执行它。到目前为止,这将与常规回调完全相同。
当你把承诺串联起来的时候,你就能很好地利用承诺,就像这样:
query.find().then(function() {
console.log("success!");
return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
console.log("error");
}).then(function() {
console.log("success on second callback!");
}, function() {
console.log("error on second callback");
});
我需要做什么来让这个函数等待承诺的结果?
使用async/await(不是ECMA6的一部分,但是
自2017年底起适用于Chrome, Edge, Firefox和Safari,见canIuse)
中数
async function waitForPromise() {
// let result = await any Promise, like:
let result = await Promise.resolve('this is a sample promise');
}
因评论而增加:
async函数总是返回一个Promise,在TypeScript中它看起来像:
async function waitForPromise() {
// let result = await any Promise, like:
let result: Promise<string> = await Promise.resolve('this is a sample promise');
}