2015-08-25 2 views
1

Я прочитал Produce a promise which depends on recursive promises chaining recursive promise with bluebird Recursive Promises? , но я до сих пор не могу понять, что случилось с тем, как я структурировать мои обещанияРекурсивный Promise в Bluebird не возвращаются

Так я выборку объектов из база данных. Каждый объект имеет поле, но иногда он имеет ссылку на UUID. Так, например, если у человека есть друг и мать, это было бы как

{ 
    "id": e872530a-27fc-4263-ad39-9a21568c31ef, 
    "name": "dood", 
    "friendId": "571746fc-686d-4170-a53e-7b7daca62fa0", 
    "motherId": "99b65849-1f1c-4881-a1d0-c5ae432e83a2" 
} 

Теперь идея, когда я выбирать объект, я хочу, чтобы заменить любой другой UUID с расширенной версии.

{ 
    "id": e872530a-27fc-4263-ad39-9a21568c31ef, 
    "name": "dood", 
    "friendId": { 
     "id": "571746fc-686d-4170-a53e-7b7daca62fa0", 
     "name": "peter" 
    }, 
    "motherId": { 
     "id": "99b65849-1f1c-4881-a1d0-c5ae432e83a2", 
     "name": "ma" 
    } 
} 

Таким образом, я использую обещание и рекурсию, чтобы попробовать это, но я не могу понять, что происходит не так в моих обещаниях. Я получаю этот результат вместо

{ 
    "id": e872530a-27fc-4263-ad39-9a21568c31ef, 
    "name": "dood", 
    "friendId": { 
     "isFulfilled": False, 
     "isRejected": False 
    }, 
    "motherId": { 
     "isFulfilled": False, 
     "isRejected": False 
    } 
} 

Я с помощью Bluebird JS, а вот как выглядит код

function getExpandedObj(uuid, recursiveLevel) { 
    return getObj(uuid) //This gets the object from the database 
     .then(function(obj) { 
      //I convert the obj to an array where each element is 
      //{property:value} so I can do a map over it 
      // some code to do that, I think it's irrelevant so I'll 
      // skip it 
      return objArr; 
     }) 
     .map(function(obj) { 
      //prevent infinite recursion 
      if (recursiveLevel > 0) { 
       for (var property in obj) { 
        if (typeof(obj[property]) === "string") { 
         var uuid = obj[property].match(/(\w{8}(-\w{4}){3}-\w{12}?)/g); 
         if (uuid != null) { 
          uuid = uuid[0]; 
          obj[property] = getExpandedObj(uuid, recursiveLevel-1) 
           .then(function(exObj) { return exObj;}) 
         } 
        } 
       } 
      } 
     }) 
     .then(function(obj) {return obj;}) 
} 
+0

Ах, вот что [вы просили ранее] (http://stackoverflow.com/q/32193946/1048572). – Bergi

ответ

0

Проблема в том, что а) ваша функция отображения делает return ничего, поэтому ее не ожидают b) вы не должны использовать здесь map.

Идеальное решение для этого - Promise.props Bluebird, которое ожидает обещаний относительно свойств объекта.

function getUuid(value) { 
    if (typeof value != "string") return null; 
    var uuid = value.match(/\w{8}(-\w{4}){3}-\w{12}?/); 
    if (uuid) return uuid[0]; 
    return null; 
} 
function getExpandedObj(uuid, recursiveLevel) { 
    return getObj(uuid).then(function(obj) { 
     // prevent infinite recursion 
     if (recursiveLevel <= 0) 
      return obj; 
     for (var property in obj) { 
      var uuid = getUuid(obj[property]) 
      if (uuid) { 
       obj[property] = getExpandedObj(uuid, recursiveLevel-1); 
      } 
     } 
     return Promise.props(obj); 
    }); 
} 
0

Попробуйте изменить

obj[property] = getExpandedObj(uuid, recursiveLevel-1) 
    .then(function(exObj) { 
    return exObj; 
    }); 

в

return getExpandedObj(uuid, recursiveLevel-1) 
.then(function(exObj) { 
    obj[property] = exObj; 
    return obj; 
}); 

, потому что вы задали значение b e объект обещания вместо фактического значения.

+0

Yup. спасибо – Gakho

Смежные вопросы