gpt4 book ai didi

javascript - 匿名 promise

转载 作者:行者123 更新时间:2023-11-29 19:04:48 28 4
gpt4 key购买 nike

所以 promises 对我来说是相当新的,但我喜欢这个想法。

之前...

我以前用过这个,它只在文件被完全读取并按预期工作后才简单地返回数据:

function something{
for (var i = 0; i < files.length; i++) {
//push to the array
promises.push(readFile(files[i]));
}

//use reduce to create a chain in the order of the promise array
promises.reduce(function (cur, next) {
return cur.then(next);
}, Promise.resolve()).then(function () {
//all files read and executed!
}).catch(function (error) {
//handle potential error
});
}

function readFile(file) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
reader.onload = function (progressEvent) {
loadGeoJsonString(progressEvent.target.result, file.name);
resolve();
}

reader.onerror = function (error) {
reject(error);
}

reader.readAsText(file);
});
}

目前

我想通过使用“,then”和“.catch”来重做这个来处理成功和不成功。在我当前的解决方案中(谷歌地图 API 用于澄清但无关紧要)我想 promise 一个函数而不返回原始函数中的 promise 。这是我的:

//create infobox object on marker
function createInfobox(lat, lng) {
var pos = new G.LatLng(lat, lng);

promiseThis(dropMarker, pos, 'drop marker')
.then(promiseThis(getGeocodeResult, pos, 'get address'))
.catch(reason => {alert(reason)})
.then(promiseThis(isDeliverable, pos, 'determine deliverable status'))
.catch(reason => {alert(reason)})
.then(promiseThis(getStores, pos, 'find stores'))
.catch(reason => {alert(reason)});
}

//handle promises
function promiseThis(doThis, withThis, task) {
return new Promise(function (resolve, reject) {
var result = doThis(withThis);
if (result) {
resolve(result);
} else {
reject('Unable to ' + task);
}
});
}

//drop marker on location
function dropMarker(location) {..} //return object

//get geocode results
function getGeocodeResult(latlng) {..} //return string

最后,我想将每个 promise 的结果保存在一个数组中,以备后用。目前 getGeocodeResult 只是立即返回“无法获取地址”(也是控制台错误,而不是警报)

要使这项工作正常进行,我需要了解哪些有关 promise 的信息?

最佳答案

如果您的用例是用 promise 包装函数执行(以捕获错误),您可以像下面的代码那样做。

您只需要 1 个 catch 函数来处理整个链中的错误。尝试删除评论并查看它的行为。

另请参阅 promisify 函数,在我看来它提供了更好的 API。

function promiseThis(doThis, withThis, task) {
return new Promise((resolve, reject) => {
const result = doThis(withThis);
if (result) {
resolve(result)
} else {
reject(`can't do task: ${task}`)
}
})
}

function print(name) {
// throw Error('printing error!');
console.log(name);
return name;
}

function capitalizeName(name) {
// throw Error('error capitalizing?!');
return name.toUpperCase();
}


fetch('https://randomuser.me/api/')
.then(response => response.json())
.then(json => promiseThis(print, json.results[0].email))
.then(email => promiseThis(capitalizeName, email))
.then(email => promiseThis(print, email))
.then(() => promiseThis(print, 'I can ignore the incoming value'))
.catch(e => console.error(e))

// You can achieve a nicer API like this
function getEmail(json) {
return json.results[0].email
}

function promisify(f, ...args) {
return function(resolved) {
return new Promise((resolve, reject) => {
resolve(f.apply(null, [...args, resolved]))
})
}
}

fetch('https://randomuser.me/api/')
.then(response => response.json())
.then(promisify(getEmail))
.then(promisify(print))
.then(promisify(capitalizeName))
.then(promisify(print))
.then(promisify(print, 'I can ignore the incoming value'))
.catch(e => console.error(e))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

关于javascript - 匿名 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43759382/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com