簡體   English   中英

鏈接承諾-正確的方法

[英]Chaining promises - correct methodology

我正在嘗試使用需要異步函數的Javascript創建一個Excel加載項,並向Excel返回JS承諾,並使用回調函數將承諾與最終值一起解析。 我對承諾不陌生,花了數小時閱讀並測試了此方法,但沒有成功,並且希望有人可以幫助我了解我在做錯什么。 下面是代碼:

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. 創建一個新的諾言-這需要解決/返回為“成功”
  2. 使用getData調用API數據(暫時通過代理運行以繞過CORS錯誤)
  3. 提取meta.status值(“成功”)

我嘗試了許多不同的操作,但是當前代碼寫“ last”並在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
        })

這就是您兌現承諾的方式。 您不會在另一個承諾中解決一個承諾,

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises

ES6以來,您可以使用async/await因為它簡化了鏈處理,使承諾得以解決時使用await語句,從而解決了許多麻煩。 我已經更新了您的代碼塊以使用它,看看:

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

        var result = await getData(corsproxy+apiurl);

        resolve(result.meta.status)
    })
};

/// 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();
    });
}

所做的更改

  • TEST現在是一個async function
  • 與其鏈接來自getData的已解析承諾並在TEST解析,您只需await來自getData的響應,然后對其進行解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM