2013-01-23 40 views
5

Tôi có một kịch bản mà tôi đã lồng nhau yêu cầu() các cuộc gọi để tải lên các mô-đun khác nhau.RequireJS: lồng nhau yêu cầu cuộc gọi

Có cách nào để tôi đảm bảo rằng tất cả yêu cầu() và tất cả các yêu cầu con yêu cầu() được nạp đầy đủ trước khi hàm gọi lại được gọi?

Có cách nào để chỉ định rằng yêu cầu() cuộc gọi là đồng bộ không?

function someFunction(callback) { 

    //top level require 
    require([...], function(...) { 

    //nested require 
    require([...], function(...) { 
    }); 

    //nested require 
    require([...], function(...) { 
    }); 

    }); 

    callback(); 
}; 
+0

Bạn có nên sử dụng các phụ thuộc không? – epascarello

+1

Có. Tuy nhiên, chúng tôi đang cố gắng tách công cụ của mình thành các tệp riêng biệt. Ví dụ, đoạn mã trên nằm trong FileA.js. FileB.js gọi someFunction() với gọi lại của nó. Tuy nhiên, gọi lại của nó có sự phụ thuộc vào một số cài đặt xảy ra trong hàm callbacks require() của FileA.js. Vấn đề là bản chất không đồng bộ của yêu cầu có nghĩa là gọi lại được thực hiện trước khi nó phụ thuộc trong require() được thiết lập. – user657352

Trả lời

3

Bạn cần phải thực hiện callback trong require(...) chức năng cuối cùng:

function someFunction(callback) { 
    require(['somemodule'], function(someModule) { 
    // do stuff with someModule... 

    // execute callback 
    callback(); 
    }); 
} 

gì bạn cũng có thể làm là để xác định dependencies with the define function của bạn.

Ví dụ:

define('somemodule', ['somedependency'], function(someDependency) { 
    // return somemodule 
    return { 
    someProperty: someDependency.getProperty(); 
    }; 
}); 

function someFunction(callBack) { 
    var someModule = require('somemodule'); 
    var foo = someModule.someProperty; 

    return callBack(foo); 
} 
2

Có một cách để làm cho require sync gọi. Làm cho nó CommonJS phong cách:

var module = require('modulepath') 

Vì vậy, nếu bạn muốn KHÔNG cần một funciton nhà máy ở lồng nhau đòi hỏi các cuộc gọi của bạn, bạn có thể "đồng bộ hóa" các yêu cầu cuộc gọi như vậy ... Nhưng kể từ khi bạn làm bạn ra khỏi của may mắn.

Kiểu AMD requre(depsArray, factoryFn) giống như cách đẩy mã của bạn vào một chuỗi song song. Không có cách nào để làm cho nó "đồng bộ" nhưng bạn có thể sử dụng "semaphores" để điều phối kết quả.

Câu trả lời cho câu hỏi của bạn cũng phụ thuộc rất nhiều vào những gì lồng nhau A và lồng nhau B tiêu thụ. Nếu chúng phụ thuộc vào một số sản phẩm từ trên đòi hỏi như vậy bạn hoàn toàn phải sử dụng "Cột ren" và không thể chỉ đẩy lồng nhau đòi hỏi các cuộc gọi vào tên xác định cuộc gọi:

function someFunction(callback) { 

    var resultOfOuterCode = someResultOfCalculations 

    //top level require 
    require([...], function(...) { 

    var resultOfTopRequireCode = someOtherResultOfCalculations 

    var semaphore = { 
     'count': 2 // represents the number of thread that need to be "done" before 
     , 'callback':callback // this callback is fired. 
     , 'checkIfLast': function(){ 
     this.count -= 1 
     if (!this.count) { 
      // count is now 0 - time to run our callback 
      this.callback() 
     } 
     } 
    } 

    //nested require A 
    require([...], function(...) { 
     // using resultOfTopRequireCode // <-- !!!! this is important part 
     ... 
     semaphore.checkIfLast() 
    }); 

    //nested require B 
    require([...], function(...) { 
     // using resultOfTopRequireCode // <-- !!!! this is important part 
     semaphore.checkIfLast() 
    }); 

    }); 

}; 

Nói cách khác, chỉ cần nghĩ về yêu cầu (dependsArray, factoryFn) như là "chủ đề" và áp dụng sự hiểu biết của bạn về việc sử dụng các chủ đề cho nó.

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