[英]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函數完成的是:
我嘗試了許多不同的操作,但是當前代碼寫“ 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.