在返回函数变量之前,如何等待诺言完成?

2020/11/09 04:22 · javascript ·  · 0评论

我仍在努力兑现承诺,但是由于这里的社区,我取得了一些进展。

我有一个简单的JS函数,用于查询Parse数据库。它应该返回结果数组,但是显然由于查询的异步特性(因此,promise),该函数在结果之前返回,给我留下了未定义的数组。

我需要怎么做才能使此功能等待promise的结果?

这是我的代码:

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结果数组,而是返回一个对结果数组的promise,而不是返回一个then在调用站点上的promise-这具有调用方的额外好处,即知道该函数正在执行异步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自己的博客文章中,您可以看到更多使用带有查询的解析承诺的示例

我需要怎么做才能使此功能等待promise的结果?

使用async/await(自2017年底起,ECMA6的不组成部分,但可用于Chrome,Edge,Firefox和Safari,请参见canIuse

MDN

    async function waitForPromise() {
        // let result = await any Promise, like:
        let result = await Promise.resolve('this is a sample promise');
    }

由于注释而添加:异步函数总是返回Promise,在TypeScript中,它看起来像:

    async function waitForPromise(): Promise<string> {
        // let result = await any Promise, like:
        let result = await Promise.resolve('this is a sample promise');
    }

您不想让函数等待,因为JavaScript旨在成为非阻塞的。而是在函数末尾返回promise,然后调用函数可以使用promise获取服务器响应。

var promise = query.find(); 
return promise; 

//Or return query.find(); 

您实际上不是在这里使用诺言。解析允许您使用回调或承诺;你的选择。

要使用promise,请执行以下操作:

query.find().then(function() {
    console.log("success!");
}, function() {
    console.log("error");
});

现在,要在诺言完成后执行任务,您只需在then()调用内的诺言回调中执行它即可到目前为止,这将与常规回调完全相同。

要真正利用承诺,就是将它们链接起来,如下所示:

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");
});
本文地址:http://javascript.askforanswer.com/zaifanhuihanshubianliangzhiqianruhedengdainuoyanwancheng.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!