2015-12-03 78 views
2

我遇到了這個問題,我無法通過Google搜索找到解決方案。

我有一個庫,我正在使用(並且不想編輯,除非真的有必要),它允許用戶選擇一個項目,然後調用我的自定義回調函數來修改該項目,然後繼續與它合作。

我需要對其執行一些異步任務,這可能需要一些時間。這會創建競爭條件,因爲當回調函數完成時,我的異步任務尚未完成,並且庫繼續處理項目。

library.onItemSelectionCallback = function (item) { 

    myService.modifyItem(item).then(
     function (modifiedItemProperty) { 
      item.newProperty = modifiedItemProperty; 
     }); 
    myService.anotherModifyItem(item).then(
     function (modifiedItemProperty) { 
      item.existingProperty = modifiedItemProperty; 
     }); 
} 

如何等待我的兩個異步任務完成,讓這個回調結束之前?

我能想到的唯一事情就是循環着,每隔幾百毫秒睡一會兒,直到兩個承諾都已解決,但這似乎不是一個很好的解決方案。

據我所知,這使得異步請求非常同步,並可能對用戶體驗不利,但實際上並沒有看到另一種出路。

編輯:我知道,我和消除問題的一般性質,從而使它過於本地化,我會說,我試圖用angular-file-upload模塊,特別是冒着,試圖安裝一個定製imageService,這會在上傳之前調整圖片的大小。我正在將它掛在onBeforeUploadItem回調上。這個想法是,創建調整大小的圖像可能需要一段時間,這就是爲什麼我需要從我的imageService返回承諾,這需要在上傳之前解決。

+0

不,如果該庫無法處理異步選擇回調,則需要對其進行編輯(或向上遊發送功能請求)。這是沒有辦法的。甚至不要嘗試像忙碌的等待。 – Bergi

+1

我發現不幸的是,[angular-file-upload](https://github.com/nervgh/angular-file-upload)模塊的作者選擇使用原生HTML 5上傳,而不是使用AngularJS'$ http'服務。我建議您避免使用該模塊及其API。 – georgeawg

回答

1

對於我的問題的第一部分 - 是的,我想真正等待這兩個承諾解決的唯一方法是使用whilesleep,使它們同步,這可能會工作,甚至不會那是不好的(除非網站在請求被滿足之前暫停),但是會讓我感到自己作爲一個人以及我的行爲如何影響這個世界非常非常糟糕。

不可能正確地混合回調和承諾,而無需hacks afaik。

對於我的問題的第二部分 - 按@georgeawg的意見,想通實現HTML5 API和回調,而不是$http服務和承諾的AngularJS模塊是一個很好的AngularJS模塊不應該怎麼實現,所以我轉向了一個不同的模塊ng-file-upload,儘管人們可能會說它不那麼時尚,但它能夠很好地以角度的方式完成這項工作(ng-file-upload提供了一個簡單的$upload服務,它返回一個承諾。如果你想在上傳之前修改文件,建議的方法是隻需$ watch並捕獲用戶拖放或選擇文件的時刻。)。

3

如果modifyItemanotherModifyItem獨立工作(即,一個不依賴於其他的),你可以管他們兩個到$q.all,如

library.onItemSelectionCallback = function(item) { 
    var promises = { 
     newProperty: myService.modifyItem(item), 
     existingProperty: myService.anotherModifyItem(item) 
    }; 

    return $q.all(promises).then(function(values) { 
     return angular.extend(item, values); 
    }); 
} 

這將返回所有以item解決的承諾。

+0

會這樣嗎? 'onItemSelectionCallback'函數將設置一個承諾,只有當兩個基礎承諾都已解決時才解析,將附加的onSuccess(帶有angular.extend的函數)附加到此解析上,並返回一個承諾,只有在onSuccess '功能已經完成。但它仍然是'onItemSelectionCallback'函數返回的承諾。圖書館沒有什麼能夠等待這個承諾的解決。該庫只是執行'onItemSelectionCallback'函數,並在控制權恢復後繼續工作。 – Reinis

+0

@georgeawg:其實,根據它的文檔。當... – Bergi

+0

@ user3104219:那麼你的運氣不好。 – Bergi