2014-10-18 22 views
13

Tôi đã đập đầu vào bức tường này trong 3 ngày qua.Gọi điện thoại đường dây với các lời hứa

Tôi đang sử dụng sailsjs & ORM đường nước đi kèm. Tôi muốn chạy DB gọi một cái khác. Tôi biết tôi có thể làm điều này bằng cách lồng vào bên trong "sau đó" cuộc gọi nhưng nó chỉ có vẻ sai.

tôi đã giới thiệu tài liệu Q và hướng dẫn nhiều lần nhưng tôi vẫn không nhận được như thế nào để kết nối và lửa "sau đó" cuộc gọi từ Promises hiện tuần tự :(

Tôi muốn:

  1. tạo một người dùng
  2. tạo một hành động
  3. liên kết người dùng & hành động
  4. cập nhật người dùng
  5. cập nhật hành động

Mã của tôi trông giống như

var mail = '[email protected]'; 

Users.create({email:mail, name:''}).then(console.log).fail(console.log); 

Actions.create({actionID:123}) 
.then(function(error, action){ 
     Users.findOneByEmail(mail).then(function(person){ 
      person.actions.add(action.id); 
      person.save(console.log); 
     }).fail(console.log) 
    }); 

Users.update({email:mail},{name:'Brian'}).exec(console.log); 
Actions.update({actionID:123},{now:'running'}).exec(console.log); 

Như bạn có thể nhìn thấy từ đoạn code tôi đã sử dụng một hỗn hợp của exec & sau đó: P

Tôi nghĩ rằng con đường là để kết nối các Users.create (...). sau đó -> Action.create (...). sau đó -> Users.findOneByEmail (...). sau đó -> * và cập nhật.

lớn nhờ từ bất kỳ sự giúp đỡ

Trả lời

13

Vì vậy, sau khi nghiên cứu một ngày. Tôi nghĩ rằng tôi đã nứt nó.

Lưu ý: Phiên bản đầu tiên tôi đã làm việc có "sau đó" s lót-up (loại bỏ các kim tự tháp của doom) bằng cách trả lại tạo. Điều này cho phép tôi gọi sau đó trên dòng tiếp theo để kích hoạt tạo. http://documentup.com/kriskowal/q/#tutorial/chaining

Dưới đây là phiên bản cuối cùng của tôi

var mail = '[email protected]';  

Users.Create({email:mail,name:''}) 
    .then(function(user){ 
    return [Actions.create({actionID:123}),user]; 
    }).spread(function(action, user){ 

    user.action.add(action.id); 
    user.name = 'Brian'; 
    user.save(); 

    action.now = 'running'; 
    action.save(); 
    }).catch(console.error); 

Một trong những điều tuyệt vời là "lan truyền" cho phép bạn để dòng-up "Promises" và "giá trị" để được trả lại một tất cả họ đều đã hoàn thành vào "sau đó" tiếp theo.

+0

'Không' của bạn sẽ không hoạt động và thích' bắt'. Khác hơn là công việc tốt! –

+0

Cảm ơn @BenjaminGruenbaum Tôi không biết liệu mình có cần một công thức cuối cùng() hoặc sau đó() ví dụ'}). Sau đó(). Fail ('. Điều này có làm việc không? HOẶC hoán đổi lỗi (...) cho một catch (...) là những gì bạn có ý nghĩa? – codemeasandwich

+0

Cũng trên http://documentup.com/kriskowal/q/#tutorial ví dụ đầu tiên có 'bắt (...). done();' Tại sao chúng ta cần ** thực hiện ** cuối cùng? – codemeasandwich

Các vấn đề liên quan