【发布时间】:2020-08-08 20:27:53
【问题描述】:
我在使用 Promise 解析代码之前遇到问题。
我有多个页面,哪个页面首先加载对我来说很难说,来自多个承诺的解析数据被所有开发人员使用。
这是我如何从多个承诺中获取解析数据
asyncCompletedPromise = Promise.all([getUserCollection(), getDefaultSettings(), getGroupUsersDetails()]).then((values) => {
console.log('all promises are done');
console.log(values);
return values;
});
问题:如何将这个asyncCompletedPromise 变量作为基于promise 的变量,以便我可以在promise 被重新使用之前使用它。
这是工作演示:
var asyncCompletedPromise = Promise, apiCompletedTracker = {};
function getUserCollection(){
return new Promise(function(resolve,reject){
$.ajax({
url: 'https://jsonplaceholder.typicode.com/users',
type: 'GET',
dataType:'json',
success: function(data){
console.log('getUserCollection api completed');
apiCompletedTracker['getUserCollection'] = 'completed';
resolve({user:data});
}
});
});
}
function getDefaultSettings(){
return new Promise(function(resolve,reject){
$.ajax({
url: 'https://jsonplaceholder.typicode.com/users',
type: 'GET',
dataType:'json',
success: function(data){
setTimeout(function(){
console.log('getDefaultSettings api completed');
apiCompletedTracker['getDefaultSettings'] = 'completed';
resolve({default:data});
},1500);
}
})
});
}
function getGroupUsersDetails(){
return new Promise(function(resolve,reject){
$.ajax({
url: 'https://jsonplaceholder.typicode.com/posts',
type: 'GET',
dataType:'json',
success: function(data){
setTimeout(function(){
console.log('getGroupUsersDetails api completed');
apiCompletedTracker['getGroupUsersDetails'] = 'completed';
resolve({group:data});
},2500);
}
})
});
}
// when all of the above function completes i can apply
asyncCompletedPromise = Promise.all([getUserCollection(), getDefaultSettings(), getGroupUsersDetails()]).then((values) => {
console.log('all promises are done');
//console.log(values);
return values;
});
asyncCompletedPromise.then(function(values){
console.log('variable used first time');
});
asyncCompletedPromise.then(function(values){
console.log('variable used second time');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
当我在所有承诺 Promise.all() 被解析之前使用 asyncCompletedPromise 变量时,代码给出错误
var asyncCompletedPromise = Promise, apiCompletedTracker = {};
function getUserCollection(){
return new Promise(function(resolve,reject){
$.ajax({
url: 'https://jsonplaceholder.typicode.com/users',
type: 'GET',
dataType:'json',
success: function(data){
console.log('getUserCollection api completed');
apiCompletedTracker['getUserCollection'] = 'completed';
resolve({user:data});
}
});
});
}
function getDefaultSettings(){
return new Promise(function(resolve,reject){
$.ajax({
url: 'https://jsonplaceholder.typicode.com/users',
type: 'GET',
dataType:'json',
success: function(data){
setTimeout(function(){
console.log('getDefaultSettings api completed');
apiCompletedTracker['getDefaultSettings'] = 'completed';
resolve({default:data});
},1500);
}
})
});
}
function getGroupUsersDetails(){
return new Promise(function(resolve,reject){
$.ajax({
url: 'https://jsonplaceholder.typicode.com/posts',
type: 'GET',
dataType:'json',
success: function(data){
setTimeout(function(){
console.log('getGroupUsersDetails api completed');
apiCompletedTracker['getGroupUsersDetails'] = 'completed';
resolve({group:data});
},2500);
}
})
});
}
// Note below line, i want to use it somewhere before it is actually resolved
asyncCompletedPromise.then(function(values){
console.log('called before all promises are resolved,giving error, error should not happen irrespective calling it anywhere');
});
// when all of the above function completes i can apply
asyncCompletedPromise = Promise.all([getUserCollection(), getDefaultSettings(), getGroupUsersDetails()]).then((values) => {
console.log('all promises are done');
//console.log(values);
return values;
});
asyncCompletedPromise.then(function(values){
console.log('variable used first time');
});
asyncCompletedPromise.then(function(values){
console.log('variable used second time');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
【问题讨论】:
-
您在此处尝试解决的更高级别的问题是什么,这会使您需要在定义承诺之前访问它?
-
您执行
promise.all,完成后执行then。如果你想在promise完成之前做某事,不要使用then -
@charlietfl,我正在与多个开发人员合作,他们可能会在承诺真正得到解决之前使用它们,我想解决这个问题
-
"beforesolved"到底要做什么?这听起来真的很像XY Problem。您还混淆了示例中定义和解析的概念
-
任何放在
Promise.all之后的函数都会在promise解决之前运行(当然如果它不是另一个promise)
标签: javascript jquery promise