2016-12-08 78 views
1

我有以下代碼:調用解析功能發生在JavaScript無極拒絕功能

return new Promise (function (resolve,reject) { 
     if (this.ImageData && averageColor) { 
      var xhr = new XMLHttpRequest(); 
      xhr.onreadystatechange = function() { 
       if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) { 
        console.log("Image found"); 
        resolve(xhr.response); 
       }else { 
        console.log("Image not found"); 
        reject(); 
       } 
      } 
      xhr.open('GET', 'http://localhost:8765/color/'+averageColor, true); 
      xhr.send(null); 
     } 
     else { 
      reject(); 
     } 
    }); 

調用此代碼如下功能:

var v = tile.getImage(tile.getColorAverage()); 
     v.then(function (value) { 
      console.log("laughing"); 
     }).catch(function() { 
      console.log("Catch called"); 
     }); 

的問題是在我的承諾我可以看到,如果條件正確並從服務器獲取響應(由於console.log)。然而,另一方面,它根本沒有進入「那麼」的位置(甚至沒有)。由於某種原因,它會被拒絕。我瘋了,因爲我可以看到它執行應該解決它的位,但我沒有得到任何東西。任何幫助將非常感激。

編輯:

現在我只跑了一次。這裏是我的console.log跟蹤。現在更困惑:

enter image description here

+0

你在期待'this'是中前' Promise'解析器功能? – guest271314

+0

你可以把一個控制檯.log前都拒絕調用 - 只是爲了調試 –

回答

4
xhr.onreadystatechange = function() { 
    if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) { 
     console.log(xhr.response); 
     resolve(xhr.response); 
    }else { 
     reject(); 
    } 
} 

有關onreadystatechange的事情是,它被稱爲多次

有關承諾解決的事情是,一旦拒絕或解決的,它不能被拒絕或再次來拆分

第一次的onreadystatechange被調用時,狀態會是1,而不是4 ...所以你拒絕

如果狀態是,你應該只拒絕4和(完成)和狀態!= 200

xhr.onreadystatechange = function() { 
    if (xhr.readyState == XMLHttpRequest.DONE) { 
     if(xhr.status == 200) { 
      console.log(xhr.response); 
      resolve(xhr.response); 
     } else { 
      reject(); 
     } 
    } 
} 

另外,使用的onload/onError的 - 儘管你仍然需要在onload事件

xhr.onload= function() { 
    if(xhr.status == 200) { 
     console.log(xhr.response); 
     resolve(xhr.response); 
    } else { 
     reject(); 
    } 
} 


xhr.onerror= function() { 
    reject(); 
} 

檢查狀態== 200有關的東西旁註的作品,但看起來錯

return new Promise (function (resolve,reject) { 
    if (this.ImageData && averageColor) { 

this諾言構造回調裏面可能是window,或者甚至甚至可以undefined嚴格模式 - 你需要修復這些代碼是導致問題走下賽場

+0

用'readystatechange'事件代替'load'事件應該可以解決問題,是嗎? – guest271314

+0

是的,但是然後'onerror'也應該被處理 - 並且'onload'仍然需要檢查統計信息== 200 –

+0

你不會在'Promise'構造函數 – guest271314

0

thisPromise構造爲window,除非專門設置爲不同的值。 this.ImageData將評估爲false而不將this設置爲具有.ImageData作爲致電new Promise()的屬性的對象。

替代引用對象具有屬性ImageData對於this.ImageDataPromise構造函數解析器函數。

例如

function resolver(resolve, reject) { 

} 

new Promise(resolver.bind(/*object that has `.ImageData` as property*/)) 

此外,替代load事件readystatechange事件,並且包括用於XMLHttpRequest對象error事件處理程序。

+0

謝謝你。這並不能解決問題。它正在調用onreadystatechange函數中的解析函數(我可以通過console.log看到)。然而,它現在已經出現在了。然後 – fur866

+0

@ fur866 _「但是,它現在顯示在.then」_不確定你的意思? – guest271314

+0

事實上'console.log(xhr.response);'被輸出意味着(但是被誤導)如果條件爲TRUE - 所以應該沒有拒絕被稱爲 –

1

您遇到此問題的原因是onreadystatechange在請求完成之前以及在完成之前被調用多次,您將得到您的else條件,該條件調用reject。您只應拒絕,如果DONExhr.status != 200。這裏有一個例子:

if (xhr.readyState == XMLHttpRequest.DONE) { 
    if (xhr.status == 200) { 
     resolve(xhr.response); 
    } else { 
     reject(); 
    } 
}