javascript - 让 promise 在 JavaScript switch/case 中工作

标签 javascript callback switch-statement

我有一个问题(老实说,有两个问题)让一个 promise 或一个回调在 switch-case 中工作。这是基本代码。

switch (page) {

  case 'contact':

   alert('contact in switch');

   var promise = $.get(page +'.json');
   promise.then(function(data){
     console.log("Items back! ", data);                     
   });

  break;
  .......

  console.log("Response data: ", data); // This is undefined

我知道由于异步函数的性质,开关在数据返回之前落入 break,使得 data 记录为 undefined 。所以我认为将 break 放在回调中会起作用,但事实并非如此。当我这样做时,应用程序完全停止工作。

所以我想我的第一个问题是如何让 switch-case “等待”直到数据返回,然后再 break

我遇到的第二个问题是,我最终希望能够重用我的 switch,方法是将它包装在一个函数中,其中 page 参数是页面的标题用户正在导航到,回调将传回从 getPageData 函数返回的数据。当我尝试这样做时,它会导致 pageContentLoader 函数的回调出现 undefined 错误。

请注意,下面代码中的 getPageData 是一个单独的函数,它执行一个通用的 XMLHttpRequest。它工作正常,因为数据已正确记录在回调中。

pageContentLoader(page, function(data) {
                    console.log("Back with data ", data);   
});

function pageContentLoader(page, callback){
    var data;

            switch (page) {
                case 'contact':
                    console.log('contact in switch');
                    getPageData(page,function(data){
                      console.log("Contacts back! ", data);     
                    });             
                    break;    
                case 'blog':
                    console.log('blog in switch');
                    getPageData(page,function(data){
                        console.log("Posts back! ", data);      
                    });                 
                    break;    
                default:
                    alert('hey that page doesn't exist!');    
            } 
            callback(data); // results in callback undefined!!
}   

我确信有可能完成这项工作,但到目前为止,我已经尝试了所有我能找到的方法,但没有任何运气。如果有人有任何指示或想告诉我我在代码中做错了什么,我将不胜感激!

最佳答案

刚刚遇到这个问题,解决方法如下:

async getResolvedPromises(myObject) {
    const promises = await Object.keys(myObject).map(async (k) => {
        switch (k) {
            case '1':
                const firstPromise = await asyncCallNumber1()
                return firstPromise
            case '2':
                const secondPromise = await asyncCallNumber2()
                return secondPromise
            case '3':
                const thirdPromise = await asyncCallNumber3()
                return thirdPromise
            default:
                return
        }
    })

    const data = await Promise.all(promises)
    return data
}

关于javascript - 让 promise 在 JavaScript switch/case 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40185880/

相关文章:

php - JavaScript 到 PHP 的弹出窗口内容

javascript - Excel SelectionChanged 事件未触发

javascript - AngularJs 中 $interval 和 setInterval 的区别

javascript - 如何在另一个打字动画完成后执行打字动画

jquery - 重置 jQuery 函数?

java - 需要常量表达式? (Java 开关语句)

javascript - 将 div 的内容复制到剪贴板

c++ - 回调和主游戏循环。这是一个好习惯吗?

java - 使用引号 (') 的 Switch-Case

C++ |一个数组,switch 语句?需要一些指导