【问题标题】:Ajax asynchronous - how to avoid function return before completed requestAjax 异步 - 如何在完成请求之前避免函数返回
【发布时间】:2020-03-14 20:46:16
【问题描述】:

我有一个字符串 (id) 数组,我需要对其进行迭代以向 api 发出 ajax 请求并在数组中推送响应。问题在于,由于异步加载,return 语句是在调用结束之前进行的。 这里举个例子:

getArrConcat: function (id) {
    var arr = new Array();
    var arrJoin = "";
    for (var i=0; i<id.length; i++){
        Model.load(id[i], {
            success: function (org) {
                arr.push(org.data);
            }
        });
    }
    arrJoin = arr.join('; ');
    return arrJoin;
}

【问题讨论】:

标签: javascript extjs extjs6 extjs6-modern


【解决方案1】:

当结果依赖于 ajax 请求时,您不能同步执行 getArrConcat

最简单的解决方案是让getArrConcat 返回一个Promise 并让调用函数async

这看起来或多或少像:

getArrConcat: function (id) {
    return new Promise((resolve) => {
        for (var i=0; i<id.length; i++){
            Model.load(id[i], {
                success: function (org) {
                    var arr = new Array();
                    var arrJoin = "";
                    arr.push(org.data);
                    arrJoin = arr.join('; ');
                    resolve(arrJoin);
                }
            });
        }
    });
},

// call from an async method:
callGetArrConcat: async function() {
    const concatString = await this.getArrConcat(123);
    //Do something with concatString
}

【讨论】:

  • 我可以在extjs中使用异步功能吗?
  • 通常是的。在开发过程中,您需要一个支持异步功能的浏览器(所有最近的浏览器都支持)。最近的 Sencha CMD 版本能够转换 Promise 和异步函数以支持旧版浏览器(它可能会在构建期间打印类似这样的内容:JavaScript input level is NEXT and output level is ES5)。
  • 请参阅此处以供参考(Sencha CMD 6.5 更新日志):docs.sencha.com/cmd/7.0.0/guides/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多