javascript - 如何声明一个promise变量,以便在promise得到解决之前我可以在任何地方使用它
问题描述
在解决之前,我在使用 Promise 解析代码时遇到问题。
我有多个页面哪个页面首先加载对我来说很难说,来自多个承诺的解析数据被所有开发人员使用。
这是我从多个承诺中获取解析数据的方法
asyncCompletedPromise = Promise.all([getUserCollection(), getDefaultSettings(), getGroupUsersDetails()]).then((values) => {
console.log('all promises are done');
console.log(values);
return values;
});
问题:如何将此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);
}
})
});
}
// 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>
当我在解决asyncCompletedPromise
所有承诺之前使用变量时,Promise.all()
代码给出错误
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>
解决方案
这与承诺无关。在为变量赋值之前,您不能使用该变量,点。
请注意,即使在您的第一个工作片段中,您也正在使用该变量,然后它所持有的承诺与 ajax 响应异步实现。
推荐阅读
- c# - Rebus saga 一致性
- flutter - 如何在 ExpansionPanelList 中添加 ImplicitlyAnimatedReorderableList (Reordareble)?
- excel - 我想根据一个单元格中使用的分隔符将一个单元格中的值拆分为多个单元格
- python - 如何在具有不同列名和不重要列的一个数据框中导入多个 csv?
- python-newspaper - Newspaper3k:如何检索已兑现的文章?
- mongodb - 如何解决 mongodump 错误“无法识别”?
- database - 根据 Access 中的最早购买日期筛选客户 ID
- php - CallbackFilterIterator 和素数生成问题
- android - 我想在嵌套子项中将数据添加到 Flutter 中的 Firebase?
- java - 如何从验证类访问 JFrame 输入字段对象