javascript - 链式 promise - 正确的方法

标签 javascript promise

我正在尝试使用 Javascript 创建一个 Excel 加载项,该加载项需要异步函数将 JS promise 返回到 Excel,并且使用回调函数使用最终值解析该 promise 。我对 promise 很陌生,花了几个小时阅读和测试它,但没有成功,并希望有人能帮助我理解我做错了什么。下面是代码:

function TEST(num1) {
    return new Promise(function (resolve) {  
        var corsproxy = "https://cors-anywhere.herokuapp.com/"
        var apiurl = "https://randomapi.com/testapi"

        var data = getData(corsproxy+apiurl).then(function(result){
            console.log ("here it comes")    
            console.log(result.meta.status)  /// This returns "Success"
            return (result.meta.status)      /// I need this to be resolved
        })
        console.log("last")
        resolve(data)
    })
};

/// Get JSON
    function getData(url) {
        return new Promise(function (resolve, reject) {
            var xhr = new XMLHttpRequest();
            xhr.open('GET', url, true);
            xhr.responseType = 'json';
            xhr.onload = function () {
                try {
                    if (xhr.status === 200) {
                        resolve(xhr.response);
                    }
                    else if (xhr.status !== 200) {
                        reject({
                            error: 'Request failed. ' + xhr.response
                        });
                    }
                } catch (e) {
                    reject({
                        error: e
                    });
                }
            };
            xhr.send();
        });
    }

第二个函数 getData 按预期工作并返回 JS 对象。我试图用 TEST 函数完成的任务是:

  1. 创建一个新的 Promise - 这需要解决/返回为“成功”
  2. 使用 getData 调用 API 数据(暂时通过代理运行以绕过 CORS 错误)
  3. 提取meta.status值(“Success”)

我尝试了许多不同的方法,但当前代码“最后”写入并在 getData 函数完成之前解析未定义的数据。将“return (result.meta.status)”更改为“resolve (result.meta.status)”也没有帮助。

任何有关我做错的事情的帮助将不胜感激。

最佳答案

function TEST(num1) {
        var corsproxy = "https://cors-anywhere.herokuapp.com/"
        var apiurl = "https://randomapi.com/testapi"

        return getData(corsproxy+apiurl)
}

TEST(valofnum1).then(function(result){
            console.log ("here it comes")    
            console.log(result.meta.status)  /// This returns "Success"
            return (result.meta.status)      /// Needs to be resolved
        })

这就是你链接 promise 的方式。你没有在另一个 promise 中解决一个 promise ,

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

关于javascript - 链式 promise - 正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51652369/

相关文章:

javascript - 客户端文本宽度的服务器端计算

javascript - 如何在 JavaScript 中链接 SOAP 请求中的 WSDL 文件?

javascript - 让 promise 保持未解决状态直到按钮被点击

javascript - Promise 拒绝因异常而暂停,但没有记录错误

javascript - 如何通过 JavaScript 在输入中设置值?

javascript - 如何使用javascript检测数据表分页其他页面中的复选框?

javascript - 如何将 Angular JS 添加到现有的 Node.js 应用程序?

node.js - 从 Mongoose promise 返回响应

node.js - 创建函数来正确链接 Promise

javascript - 使用 AJAX 调用的结果初始化 Vue 数据