gpt4 book ai didi

javascript - 使用替代 promise 时如何解决 ajax 调用中的错误

转载 作者:行者123 更新时间:2023-11-30 16:07:17 25 4
gpt4 key购买 nike

我开发了以下代码(也可在此代码笔 http://codepen.io/PiotrBerebecki/pen/QNVEbP 中找到),用于构建根据用户位置坐标提供天气数据的应用。

用户的位置将由 getCoordinatesMethod1() 函数提供。但是,如果失败,该位置应由 getCoordinatesMethod2() 函数提供。

我如何将 getCoordinatesMethod2() 添加到 promise 链(底部),以便仅在 getCoordinatesMethod1() 无法提供位置时使用它?

另外,将来为了让应用程序更健壮,我可能会添加更多方法来获取位置数据,这样链逻辑也应该能够适应这一点。

// The first method to get user location coordinates.
function getCoordinatesMethod1() {
return $.ajax('http://wwww.example.com/coordinates-method-1.json');
}

// The second method to get user location coordinates.
// This should only be used if method 1 fails to deliver coordinates.
function getCoordinatesMethod2() {
return $.ajax('http://wwww.example.com/coordinates-method-2.json');
}

// Function which provides weather data depending on user coordinates.
function getCurrentWeather(latitude, longitude) {
return $.ajax('http://www.example.com/lat=' + latitude + '&lon=' + longitude + 'weather.json');
}

// Promises chain
getUserCoordinates1().then(function(locationData) {
return getCurrentWeather(locationData);
}).then(function(weatherData) {
return showCurrentWeather(weatherData);
})

最佳答案

您可以创建一个调用第一个方法的函数,如果返回的 promise 被拒绝,则调用第二个方法:

function getCoordinateBoth() {
return getCoordinatesMethod1().then(null, getCoordinatesMethod2);
}

如果实际上有参数传递给这些函数,那么您可以像这样传递这些参数:

function getCoordinateBoth(/* args here */) {
var args = Array.prototype.slice.call(arguments);
return getCoordinatesMethod1.apply(null, args).then(null, function() {
return getCoordinatesMethod2.apply(null, args)
});
}

您甚至可以将这些函数放在一个数组中,这样它就可以无限扩展:

// Put list of functions to be call as a chain until one succeeds
// You can just add more functions here as long as each returns a promise
// and expects the same arguments
var getCoordFunctions = [getCoordinatesMethod1, getCoordinateMethod2, getCoordinateMethod3];

function getCoordinateChain(/* args here */) {
var args = Array.prototype.slice.call(arguments);
var fnArray = getCoordFunctions.slice(0);
var firstFn = fnArray.shift();
fnArray.reduce(function(p, fn) {
return p.then(null, function() {
return fn.apply(null, args);
});
}, firstFn.apply(null, arguments));
}

您甚至可以将其设为通用的 promise 链函数:

function chainUntilResolve(array /* other args here */) {
var args = Array.prototype.slice.call(arguments);
// toss first arg
args.shift();
// make a copy of array of functions
var fnArray = array.slice(0);
// remove first function from the array
var firstFn = fnArray.shift();
fnArray.reduce(function(p, fn) {
return p.then(null, function() {
return fn.apply(null, args);
});
}, firstFn.apply(null, arguments));
}


var getCoordFunctions = [getCoordinatesMethod1, getCoordinateMethod2, getCoordinateMethod3];

chainUntilResolve(getCoordFunctions, arg1, arg2).then(function(data) {
// process data here
}, function(err) {
// error here
});

关于javascript - 使用替代 promise 时如何解决 ajax 调用中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36844658/

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