簡體   English   中英

角度承諾無法正確解決

[英]angular promise not resolving correctly

我正在努力爭取在Firebase查詢后解決該問題。 本質上,我想從一個表中獲取所有指定的鍵,然后遍歷另一個表以獲取所需的圖稿。

artistFactory.js

'use strict';

angular.module('artvoicesApp')
  .factory('Artist', function(localStorageService, FIREBASE_URL, $q) {

    var artistData = {};
    var userKey = localStorageService.get('userKey');
    var accountKey = localStorageService.get('accountKey');
    var artistRef = FIREBASE_URL.child('v2/artist');
    var accountRef = FIREBASE_URL.child('v2/account/' + accountKey);
    var userRef = FIREBASE_URL.child('v2/user/' + userKey);

    artistData.addArtist = function(artistName) {
      var artist = artistRef.push();
      accountRef.child('artists/' + artist.key()).set(true);
      userRef.child('artists/' + artist.key()).set(true);
      artist.set({name: artistName});
      artist.child('users/' + userKey).set(true);
      artist.child('accounts/' + accountKey).set(true);
    };

    artistData.getArtistKeys = function() {
      var artistKeys = [];
      var defer = $q.defer();
      accountRef.child('artists').once('value', function(snapshot) {
        snapshot.forEach(function(childSnapShot) {
          artistKeys.push(childSnapShot.key());
        });
        defer.resolve(artistKeys);
      });
      return defer.promise;
    };

    artistData.getArtists = function(artistKeys) {
      var artistObj = {};
      var artistRef = FIREBASE_URL.child('v2/artist');
      var defer = $q.defer();

      artistKeys.forEach(function(artist) {
        artistRef.child(artist).once('value', function(snapshot) {
          artistObj[artist] = snapshot.val();
        });
        defer.resolve(artistObj);
      });
      return defer.promise;
    };

    return artistData;
  });

artwork.controller.js

Artist.getArtistKeys().then(function(artistKeys) {
  Artist.getArtists(artistKeys).then(function(artists) {
      vm.artists = artists;
      console.log(vm.artists);
  });
});

如果將vm.artwork設置為超時,它將返回適當的數據。

這是您的問題:

  artistKeys.forEach(function(artist) {
    artistRef.child(artist).once('value', function(snapshot) {
      artistObj[artist] = snapshot.val(); // <<== This is called second, at an unspecified time in the future
    });
    defer.resolve(artistObj);  // <<== This is called first
  });

you called defer.resolve(artistObj) . 您調用defer.resolve(artistObj) 某個時間您對artistObj所有分配都會發生。 這就是為什么添加超時后它似乎可以工作的原因。

您將需要將您的藝術家收藏映射到承諾的收藏,然后等待所有這些承諾解決。

artistData.getArtistKeys = function(artistKeys) {
  var artistObj = {};
  var artistRef = FIREBASE_URL.child('v2/artist');
  var allPromises = artistKeys.map(function(artist) {
    var childDefer = $q.defer();
    artistRef.child(artist).once('value', function(snapshot) {
      artistObj[artist] = snapshot.val();
      childDefer.resolve();
    });
    return childDefer.promise();
  });
  // allPromises is now an array of promises
  var defer = $q.defer();
  $q.all(allPromises).then(function() {
    defer.resolve(artistObj);
  });
  return defer.promise();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM