繁体   English   中英

如何声明 promise 变量,以便我可以在 promise 得到解决之前在任何地方使用它

[英]How to declare a promise variable so that i can use it anywhere before promise gets resolved

我在使用 promise 解析代码之前遇到问题。

我有多个页面,我很难说哪个页面首先加载,所有开发人员都使用来自多个 promise 的解析数据。

这是我如何从多个 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 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 之前的变量,它与 ajax 响应异步实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM