2015-09-10 1 views
0

Я хочу создать окно и когда он будет создан, запустите функцию, которая была предварительно загружена. Мне нужно подождать, пока не будет создано окно, иначе функция не будет доступна и не будет выполнена. И я бы сказал, что могу сделать это с обещанием.javascript, создать окно в веб-приложении Chrome, как включить обещание для успешного вызова функции нового окна?

Как это сделать? Здесь есть код с моей попытки сделать это

one().then(function() { 
    new_panel.contentWindow.load_content(something); 
}) 

function one() { 
    var promise = chrome.app.window.create('empty.html', 
    { 
    id: 'protein_panel', 
    outerBounds: { 
     width: 300, 
     height: 800, 
    }, 
    }, 
    function(createdWindow) { 
    createdWindow.contentWindow.load_content = function(data) { 
     createdWindow.contentWindow.document.getElementById('loading_content').appendChild(data); 
    } 
    new_panel = createdWindow; 
    }); 

    return promise; 
} 

Он жалуется на то функции один(): Uncaught TypeError: Не удается прочитать свойство «то» неопределенной

UPDATE: Слегка изменен код, по-прежнему не работает, я использовал обещание от углового, поскольку я использую его

one().then(function() { 
    new_panel.contentWindow.load_content(something); 
}) 

function one() { 
    return chrome.app.window.create('empty.html', 
    { 
    id: 'protein_panel', 
    outerBounds: { 
     width: 300, 
     height: 800, 
    }, 
    }, 
    function(createdWindow) { 
    createdWindow.contentWindow.load_content = function(data) { 
     createdWindow.contentWindow.document.getElementById('loading_content').appendChild(data); 
    } 
    new_panel = createdWindow; 

    var deferred = $q.defer(); 
    deferred.resolve(); 
    console.log(deferred.promise) 
    return deferred.promise; 
    }); 
} 

В теории deferred.promise должна быть возвращена только тогда, когда она будет решена, но это как и то() функция выполняется до того, как она на самом деле произойдет. Зачем?

UPDATE2: или другой способ сделать то же самое (не работает либо)

one(); 

function one() { 
    chrome.app.window.create('empty.html', 
    { 
    id: 'protein_panel', 
    outerBounds: { 
     width: 300, 
     height: 800, 
    }, 
    }, 
    function(createdWindow) { 
    createdWindow.contentWindow.load_content = function(data) { 
     createdWindow.contentWindow.document.getElementById('loading_content').appendChild(data); 
    } 
    new_panel = createdWindow; 

    var deferred = $q.defer(); 
    deferred.resolve(); 
    console.log('first '+deferred.promise) 
    return deferred.promise; 
    }).then(function() { 
    console.log('second') 
    new_panel.contentWindow.load_content(something); 
    }); 
} 

В журнале «второй» выводится перед «первым». Что-то не так с кодом?

+0

Как именно это «жаловаться»? Что такое возвращаемое значение 'chrome.app.window.create (' ... ')'? Другими словами, каково возвращаемое значение 'one()'? – Xufox

+0

Uncaught TypeError: Невозможно прочитать свойство «then» неопределенного, а значение обещания не определено – Gerard

+0

Там вы идете. «обещание» - это не обещание, а «неопределенное». – Xufox

ответ

2

Вы хотите синхронно вернуть обещание от one() и разрешить обещание с новым окном, как только он был создан:

one().then(function(createdWindow) { 
    // Window has been created 
    createdWindow.contentWindow.load_content(something); 
}) 

function one() { 
    // create a promise 
    var deferred = $q.defer(); 

    chrome.app.window.create('empty.html', 
    { 
    id: 'protein_panel', 
    outerBounds: { 
     width: 300, 
     height: 800, 
    }, 
    }, 
    function(createdWindow) { 
    // resolve our promise and pass the window to the `then` block 
    deferred.resolve(createdWindow) 
    }); 

    // synchronously return a promise 
    return deferred.promise; 
} 
+0

Какова роль аргумента createdWindow в .then (function (createdWindow? Я имею в виду, это необходимо для обещания или это только способ доступа к createdWindow (и то можно обменять) – Gerard

+0

@Gerard: Это не обязательно для обещания разрешить в правильном порядке. Я просто добавил его в качестве удобства, чтобы вы могли получить доступ к созданномуWindow, если хотите. – dthareja

+0

Большое спасибо, я внедрил его и работает отлично^_ ^ – Gerard