Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 34

0
votes
answers
8 views
+10

Google sheet countif cell not empty and background color not white

1

我有一個在線電子表格,可以跟蹤所有流媒體電視提供商(Sling,DIRECTV NOW,PS Vue,Youtube TV,Philo等)的現場本地頻道)Google sheet countif cell not empty and background color not white

http://streambuzz.net/streaming-tv-local-channels/

我使用下面的公式來包括在總計的計數細胞:

=countif(B5:B199,"<>") 

每個非空單元格將具有表示所述主要網絡附屬的一個標誌(ABC, CBS,FOX,NBC,C W,MyTV,Telemundo)

但是,我需要能夠跟蹤何時激活的電臺突然停止播出,並且只能成爲點播節目(通常是因爲失敗的轉播談判),例如本週發生的Playstation Vue客戶失去了所有Tribune擁有的福克斯電臺(大約十幾個受影響的主要城市)

在這種情況下,我想突出顯示帶有白色背景的單元格,但在其中留下Fox徽標以指示特殊情況。

因此,長問題總之,如何將公式條件附加到計數單元格,只有當它非空且AND具有白色背景時?

沙发
0
1

你可以寫這樣的自定義函數:

function checkw(row1, row2, column) { // input is range of cells like "A1:A25" 
    var counter = 0; 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    for (var row = row1; row <= row2; row++) { 
     var cellobj = sheet.getRange(row, column); 
     var cellval = cellobj.getValue(); 
     var currentColor = cellobj.getBackground(); 
     if (currentColor === "#ffffff" && cellval === "") { 
      counter++; 
     } 
     Logger.log(counter); 
    } 
    return counter; 
} 

,並從細胞在電子表格中這樣稱呼它: = checkw(2,22,1)

前有兩個參數是開始和結束行。第三個參數是列。

+0

如果您之前沒有完成Google工作表腳本,LMK和我可以幫助您開始。 – NancySchorr

0
votes
answers
8 views
+10

如何根據需要在Android中顯示每月日曆視圖?

-1

我的學術項目需要顯示當前月份的日曆,並且只顯示少部分詳細信息,例如用戶在特定日期的訪問次數。沒有其他功能需要像提醒,筆記等。我只需要顯示以下格式。我搜索了許多日曆API,但無法找到符合目的的API。您的幫助將不勝感激。如何根據需要在Android中顯示每月日曆視圖?

Here is the design I need to implement in app

沙发
0
0

您可以創建使用視圖尋呼機和GridView的自己的日曆。正如我所看到的,您需要選擇特定月份的多個日期,您需要一個定製的日期。 結帳這些鏈接,你會得到一個關於它的想法:

1. Caldroid

2. calendarview

這些是由程序員真棒一些工作,你可以在你的項目中使用這一點,並採取建立一個日曆自己的想法.Thx。

0
votes
answers
7 views
+10

使用Google Analytics(分析)V4的第一個會話細分的日期

0

有誰知道如何使用Google核心報告API V4構建動態細分,該細分僅獲取具有給定事件操作的用戶,並且已記錄第一個會話 DD/MM/YYY。例如:尋找所有在12月14日「安裝」(第一次會話)移動應用並且至少生成一個「點擊xxxx」事件的用戶。使用Google Analytics(分析)V4的第一個會話細分的日期

沒有辦法在文檔中找到它。

在谷歌分析儀表板上,這可以通過創建一個「第一個會話日期」值的段來實現。

非常感謝,

沙发
0
1

你不能做到這一點有段,但我給你另一種選擇:

你可以採取'ga:sessionCount'參數的優勢。只需查詢所有會話的日期和日期X天和另一個全部N事件Y天。最後,跨Xÿ天的數據,你最終會與對X天他的第一屆和ÿ天取得ň事件的每個用戶。

(客戶端ID使用作爲渡數據時KEY

+0

嗯,可能是有趣的。我認爲我們無法獲得獨特用戶(客戶端,實際上)ID列表作爲結果的一部分。有沒有辦法檢查這個ClientID如何直接從谷歌分析儀表板直接表現出來?無法在https://developers.google.com/analytics/devguides/reporting/core/dimsmets上找到它。 –

+1

@BenjaminPiette很抱歉,GA實際上使用了一個clientID,但它不允許你訪問它,所以我們的上師這樣做了:https://www.simoahava.com/analytics/improve-data-collection-with-four-custom-dimensions /我真的很習慣總是配置這些維度。希望能幫助到你 – Marco

0
votes
answers
7 views
+10

使用它

0

JAX-RS帕拉姆轉換器 - 編譯時錯誤,這是我的PARAM轉換器使用它

import org.springframework.data.domain.Sort; 

public class MyParamConverter implements ParamConverter<Sort> { 
    @Override 
    public Sort fromString(String s){ 
     return new Sort(new Sort.Order(Sort.Direction.ASC, "ds")); 
    } 

    @Override 
    public String toString(Sort mo){ 
     return mo.toString(); 
    } 

} 

這是我paramconverter提供商

@Provider 
public class MyParamConverterProvider implements ParamConverterProvider { 

@Override 
public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) { 
    if(rawType.equals(Sort.class)){ 
     return (ParamConverter<T>) new MyParamConverter(); 
    } 
    return null; 
} 

我想在我的API使用,因爲

@GET 
@Path("/") 
Response read(@QueryParam("sort") Sort order); 

我期待的jax映射字符串,我通過我的url例如&sort="asc"來排序對象。但是我得到編譯時錯誤have a registered implementation of paramconverter provider。當我通過查詢參數&sort="somethung"時,我需要找到一種方法,通過使用自定義註釋或使用Param Converter自動轉換爲SORT

+0

? – sschrass

+0

@sschrass。那就是問題所在。我不知道如何註冊提供商。 – user3678399

沙发
0
0

參考您的意見,嘗試註冊您的供應商,如:

@ApplicationPath("/") 
public class MyApplication extends ResourceConfig { 

    @Override 
    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> classes = new HashSet<Class<?>>(); 
     classes.add(MyParamConverterProvider.class); 

     return classes; 
    } 
} 

或者,如果您有您註冊的供應商使用澤西

@ApplicationPath("/") 
public class MyApplication extends ResourceConfig { 

    public MyApplication() { 
     packages("my.package"); 

     // or without package scanning 
     register(MyParamConverterProvider.class); 
    } 
} 
+0

感謝您的更新。我會嘗試使用它。你能告訴我爲你的答案的選項1的ResourceConfig或Maven依賴項的導入。 因爲我害怕我使用錯誤的。 – user3678399

+0

因爲當我使用選項1時,它說不能覆蓋getClasses()作爲超級類中的最終成績 – user3678399

+0

我推薦使用Jersey。本教程中還有一個Spring-Boot啓動器:https://howtodoinjava.com/spring/spring-boot/spring-boot-jersey-example/否則將您的依賴關係添加到您的問題中,很難找出你正在使用的是什麼。 – sschrass

0
votes
answers
7 views
+10

爲什麼HttpClient PutAsync在成功更新後返回內部服務器錯誤

0

我有一個HttpPut API方法,用於編輯它傳遞併成功保存到數據庫中的對象。這工作正常,但是從我的MVC應用程序,我用來調用我的API Put方法的httpClient.PutAsync返回內部服務器錯誤,即使API Put方法沒有。爲什麼HttpClient PutAsync在成功更新後返回內部服務器錯誤

我不知道什麼錯誤,API方法工作正常,但不知何故MVC的HttpClient仍然得到一個內部服務器錯誤。

API put方法

[HttpPut] 
    public IActionResult Put([FromBody] School school) 
    { 
     try 
     { 
      var schoolExists = _schoolRepository.SchoolExists(school.Id); 

      if (!schoolExists) return NotFound(); 

      if (!ModelState.IsValid) return BadRequest(); 

      var schoolData = Mapper.Map<School, Data.School>(school); 

      var updatedClass = _schoolRepository.UpdateSchool(schoolData); 

      if (!updatedClass) return Json(GetHttpResponseMessage(HttpStatusCode.InternalServerError)); 

      var route = CreatedAtRoute("GetSchool", school); 

      return route; 
     } 
     catch (Exception e) 
     { 
      return LogException(e); 
     } 
    } 

上述方法,工作正常,我的改變被保存到數據庫中,CreatedAtRouteResult對象從API方法返回。上述

MVC的HttpClient

public async Task<T> PutObject(string path, T content, string accessToken) 
    { 
     using (var httpClient = new HttpClient()) 
     { 
      try 
      { 
       SetBaseUri(httpClient, accessToken); 

       var serialisezContent = CreateHttpContent(content); 

       var httpResponse = await httpClient.PutAsync(path, serialisezContent); 

       if (httpResponse.StatusCode == HttpStatusCode.InternalServerError) throw new Exception("Problem accessing the api"); 

       return JsonConvert.DeserializeObject<T>(GetResult(httpResponse)); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

    } 

的方法,其中是問題是,這條線var httpResponse = await httpClient.PutAsync(path, serialisezContent);仍返回內部服務器錯誤。我的POST有相同的實現,並且工作得很好。

SETBASEURI()

private void SetBaseUri(HttpClient httpClient, string accessToken) 
    { 
     httpClient.BaseAddress = new Uri(BaseUri); 
     httpClient.DefaultRequestHeaders.Authorization = 
      _authenticationHeaderValueCreator.CreateAuthenticationHeaderValue("bearer", accessToken); 
    } 

CreateHttpContent()

public ByteArrayContent CreateHttpContent<TParam>(TParam httpObject) 
    { 
     var content = JsonConvert.SerializeObject(httpObject); 
     var buffer = System.Text.Encoding.UTF8.GetBytes(content); 
     var byteContent = new ByteArrayContent(buffer); 

     byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 

     return byteContent; 
    } 
沙发
0
0

我敢打賭,你的API Put方法確實有消息No route matches the supplied values返回HTTP 500錯誤。你可以在Fiddler中檢查它。

而問題是具有以下線:

var route = CreatedAtRoute("GetSchool", school);

CreatedAtRoute方法以一個路徑名作爲第一個參數。我懷疑你有一條名爲GetSchool的路線。這是相同控制器中的一個操作名稱。而且CreatedAtRoute不會爲未知路由拋出異常,它只會返回500個錯誤碼。

要解決此問題,使用CreatedAtAction方法,而不是CreatedAtRoute

var route = CreatedAtAction("GetSchool", school); 
板凳
0
0

我認爲這個問題是從API的結果是失敗的序列化。嘗試在單元測試中手動序列化結果並查看失敗的位置。

0
votes
answers
7 views
+10

細胞是公式嗎?在googlescript

0

如果所選單元格是公式,我想要執行一個操作,該怎麼辦?細胞是公式嗎?在googlescript

某些命令,如Google表格的isformula()。

例: 如果(細胞== 「公式」?){使事情} 其他{使事情}

+0

的'gas'標記是GNU彙編。請使用適當的標籤編輯您的問題。 –

沙发
0
1

功能getFormula()可以得心應手:

getFormula()

輸出。字符串

如果單元格爲空或不包含公式,則返回該範圍的左上角單元格的公式(A1表示法)或空字符串。

請嘗試:

if (range.getFormula().substring(0, 1) === '=' 
{ 
    // there is a formula 
} 

substring(0,1)獲得左側符號:

https://www.w3schools.com/jsref/jsref_substring.asp

0
votes
answers
6 views
+10

一次啓動多個任務,然後在完成其中一個任務時啓動另一個任務

1

我有一個運行在從其他站點下載圖像文件的asp.net web api中運行的代碼。一次啓動多個任務,然後在完成其中一個任務時啓動另一個任務

這是我用來下載圖像的代碼。

 foreach (string file in images) 
     { 
      using (WebClient client = new WebClient()) 
      { 
       await client.DownloadFileTaskAsync(file, path + Path.GetFileName(file));      
      } 
     } 

我真正需要做的是立即開始10次下載。 (例如使用Task.Run ...或者其他方式),然後在最初開始的10逐個完成時逐個開始休息。

For EX。

啓動10個任務

等到了10個任務完成一個

1次時完成,啓動另一個任務

當其他1次完成,啓動另一個任務等等

直到下載列表中的所有圖像。

所以我的代碼運行時最多有10周併發下載量(或小於10,如果沒有更多的圖像被下載。)

我使用.NET 4.5.2

你們可以指出我在正確的方向來實現這一目標嗎?

+0

這不是說這回答你的問題,而是看看Hangfire http://hangfire.io/ - 看起來像是你的需求的完美契合 – 2014-10-10 11:19:04

+0

你可能需要啓動10個任務,然後使用Task .WaitAny(taskList)' – artm 2014-10-10 11:22:42

沙发
0
2

您可以使用SemaphoreSlim扼殺異步工作方式:

private readonly SemaphoreSlim _mutex = new SemaphoreSlim(10); 

... 

var downloads = images.Select(file => DownloadAsync(file)); 
await Task.WhenAll(downloads); 

... 

private async Task DownloadAsync(string file) 
{ 
    await _mutex.WaitAsync(); 
    try 
    { 
    using (WebClient client = new WebClient()) 
    { 
     await client.DownloadFileTaskAsync(file, path + Path.GetFileName(file));      
    } 
    } 
    finally 
    { 
    _mutex.Release(); 
    } 
} 

注:

  • 您可能需要調整System.Net.ServicePointManager.DefaultConnectionLimit
  • 您應該避免在ASP.NET上使用Task.Run。請參閱我的recent MSDN article on async ASP.NET瞭解更多詳情。
+0

很好的答案。謝謝 :) – Amila 2014-10-11 17:50:20

板凳
0
0

我有點想大聲這裏,不知道這是否會工作,別人會希望它改善:

private void startFirst10Tasks() 
{ 
    List<Task> tasks = new List<Task>(); 
    //tasks.Add first 10 tasks 
    taskHandler(tasks); 
} 

private void taskHandler(List<Task> tasks) 
{ 
    Task.Factory.ContinueWhenAny(tasks, winner => 
     { 
      getNewTasks(tasks.Except(new List<Task>{winner})); 
     }); 
} 

private void getNewTasks(List<Task> tasks) 
{ 
    tasks.Add(
     Task.Factory.StartNew(() => 
     { 
      //Next DownloadFileTask 
     }) 
    ); 

    taskHandler(tasks); 
} 
0
votes
answers
6 views
+10

替代在mvc .net核心應用程序中啓動線程?

0

我們製造工廠內部有多種儀器,它們以不同的速度將數據插入數據庫內的多個表格。替代在mvc .net核心應用程序中啓動線程?

每條生產線上都有一臺計算機連接到網頁上,操作員輸入分配的作業編號並顯示一些相關信息。

我們的目標是根據工廠設備插入的數據顯示指示。狀態與原材料可用性,倉庫存儲可用性,溫度範圍等有關。

我最初的想法是通過產生一條線來修改當前的MVC應用程序,每條生產線每隔10秒掃描插入的信息,並可能推送數據槽通過signarlR來建議操作員。我讀到MVC應用程序中的起始線程是一種不好的做法,可能會影響IIS管理線程的方式。

我想知道如果不使用單獨的線程,如何在MVC中承載獨立於快速回歸的進程?

謝謝你的時間!

沙发
0
0

是的,開始輪詢線程可能不是這裏最好的方法。我可能會建議的另一種解決方案是將您所謂的工具(即當前正在插入數據)修改爲SignalR客戶端,並在每次插入一些數據時向服務器廣播一條消息。然後SignalR服務器可以簡單地將此消息廣播到與之連接的JavaScript SignalR客戶端。通過這種方式,您可以在生產數據的儀器和可以實時顯示此數據的瀏覽器客戶端之間實現(通過SignalR服務器)的直接通信。

+0

對不起,我會添加更多信息。這些設備使用梯形圖編程的PLC,這是工業和實時的。它確實支持數據庫上的CRUD操作。 –

+0

此外,我想保留服務器上的業務規則計算,因爲我們正在越來越多地將數據集成到其他系統(如ERP)。 –

+0

然後,您可能想要抽象一些您的設備將調用的API背後的CRUD操作,以便您可以輕鬆地通知SignalR服務器關於傳入更新。相信我,你完全不希望在ASP.NET應用程序中產生輪詢線程。這就像想要在腳下開槍一樣。 –

0
votes
answers
6 views
+10

如何從MySql數據庫中獲取結果並將它們發送回API.ai

0

我需要一些幫助來確定SQL查詢的語法,同時通過連接到Google雲Mysql數據庫的api.ai webhook &使用它們。 雖然查詢工作,在 '請求被超時'如何從MySql數據庫中獲取結果並將它們發送回API.ai

'use strict'; 
const mysql = require('mysql'); 

exports.name = (req, res) => { 

    let action = req.body.result['action']; 

if (action === 'apple') { 


    callDB().then((output) => { 

     res.setHeader('Content-Type', 'application/json'); 
     res.send(JSON.stringify(output)); 
    }).catch((error) => { 

     res.setHeader('Content-Type', 'application/json'); 
     res.send(JSON.stringify(error)); 
    }); 

} 
}; 

function callDB() { 
    return new Promise((resolve, reject) => { 

    try { 

     var connection = mysql.createConnection({ 
      host: "<host>", 
      user: "<user>", 
      password: "<pass>", 
      database: "<DB>" 
     }); 

     connection.query("SELECT description AS solution FROM mtable WHERE title LIKE '%Breakfast%'", function (error, results, fields) { 
      if (!error) { 

       let response = "The result is: " + results[0].solution; 
       response = response.toString(); 
       let output = {'speech': response, 'displayText': response}; 
       console.log(output); 
       resolve(output); 

      } else { 

       let output = {'speech': 'Error. Query Failed.', 'displayText': 'Error. Query Failed4.'}; 
       console.log(output); 
       reject(output); 

      } 
     }); 
     connection.end(); 

    } catch (err) { 
     let output = {'speech': 'try-catch block error', 'displayText': 'try-catch block error3'}; 
     console.log(output); 
     reject(output); 

    } 

} 
); 
} 

如果我取代與此查詢,它的工作原理:

'SELECT描述AS解決方案從mtable WHERE ID LIKE 1001'

ID是列名,只有id`s

標題列名和標題,如早餐包等

這是網絡掛接JSON所示的錯誤的部分:

"metadata": { 
    "intentId": "<id>", 
    "webhookUsed": "true", 
    "webhookForSlotFillingUsed": "false", 
    "webhookResponseTime": 5000, 

"status": { 
"code": 206, 
"errorType": "partial_content", 
"errorDetails": "Webhook call failed. Error: Request timeout.", 
"webhookTimedOut": true 
    }, 

我引用的代碼如下線程, How to get results from MySql DB using node.js MySQL and send them back to API.ai

沙发
0
0

似乎是在您的查詢字符串聲明中的錯別字(接近「%早餐% ''):

connection.query('SELECT description AS solution FROM mtable WHERE title LIKE '%Breakfast%'', function (error, results, fields) { 

在分配您的查詢字符串變量, 'SELECT描述AS解決方案從mtable WHERE標題LIKE '%早餐%'' 被解釋爲一個數字(因爲%運營商)。

以任何方式修復您的單引號是否有幫助?

connection.query("SELECT description AS solution FROM mtable WHERE title LIKE '%Breakfast%'", function (error, results, fields) { 
+0

問候,這確實解決了錯誤,但我仍然沒有從數據庫中獲取任何數據。 json只是說超時。 (API.ai在超時之前僅等待5秒,可能是什麼解決方案?「狀態」:{ 「code」:206, 「errorType」:「partial_content」, 「errorDetails」:「Webhook調用失敗。錯誤:請求超時。「, 」webhookTimedOut「:true – Jarvis

+0

我對API.ai並不熟悉我只在您的JavaScript代碼中發現了一些奇怪的東西 如果它解決了您在問題中提到的第一個問題,您的問題與關於您當前問題(包含錯誤消息)和最重要的信息相關,爲每項涉及的技術(api.ai等)添加標籤。 – RogerC

板凳
0
0

問題必須在您的服務器端與MySQL。我每天都這樣做,並且在5秒鐘內用於查詢的情況下,它可以正常工作。

可能是你的Where子句正在創建全表掃描,因此超時返回Diagflow(> 5秒)或db連接中斷。

您需要在例程和結束週期之前設置定時器,查看您的持續時間。單獨從bash腳本運行查詢並查看需要多長時間。你會發現超時正在發生的地方。在條件兩邊都有搜索參數(%)肯定會比搜索字符串的開始時間(意味着以搜索開始)和%search%(找到包含的任何子字符串)花費更長的時間。

祝你好運。

0
votes
answers
6 views
+10

角度/離子鏈接HTTP呼叫不同步

0

我目前正在使用一個有點痛苦的API:D API不會返回我的應用程序所需的全部信息,這意味着我必須多次調用得到所需要的全部信息。另外,我努力保持我的頭一輪就那麼如果它不能很好地解釋只是讓我知道!角度/離子鏈接HTTP呼叫不同步

問題

目前API流的主要細節看起來有點像這樣:

  1. 獲取 '羣組的ID' 的列表(見反應1)。

  2. 使用該列表,對於每個組ID,獲取組中的組詳細信息和類型(請參見響應2)。

  3. 使用組詳細信息,爲每種類型獲取類型名稱(請參見響應3)。

  4. 建立一個大的樹的所有細節。

  5. 使用單獨的終點,獲取所有「技能」並相應地更新樹(請參見響應4)。

這個問題是試圖在正確的位置是所有不同步返回正確的值時,因爲我嵌套承諾在異步承諾承諾:o

主要API端點和示例可以在https://esi.tech.ccp.is/latest/找到。

我目前的代碼看起來有點像下面(我嘗試按順序列出函數)。

的問題是,我需要找到一點:

  • 組的名單已返回。

  • 對於每個組類型包括已退回。

  • skillTree對象已經添加了一個新的屬性,這是在下面的格式。

技能樹目的:

skillTree = { 
    "groupName": [ 
     "skillID": { 
      "level": 0; 
     }, 
     "skill2ID": { 
      "level": 0; 
     },... 
    ], 
    "group2Name": [ 
     "skillID" { 
      "level": 0; 
     },... 
    ],... 
}; 

製表技能all.ts(調用主要功能):

 eveESI.buildSkillTree().then(() => { 
      // Need to add names to all skills in tree... 
      console.log('Completed skill tree:'); 
      console.log(eveESI.skillTree); 
     }).catch((error) => { 
      // Do error handling... 
     }); 

eveESI提供商 - buildSkillTree():

 buildSkillTree(){ 
     return new Promise((resolve, reject) => { 
      this.getSkillGroups().then((groups) => { 
       console.log('Success: Fetched groups successfully!'); 
       console.log(groups); 

       // Process groups. First get group details including types. Then for each group push to main array. 
       for (var i in groups) { 
        if (groups.hasOwnProperty(i)) { 
         this.getSkillsInGroup(groups[i]).then((data) => { 

          var groupDetails = JSON.parse(data.toString()); 

          var types = groupDetails.types; 
          var name = groupDetails.name; 

          console.log('Success: Fetched types for group ' + name + ' successfully!'); 

          // Declare and build temp group object before we push it to main skill object... 
          var tempGroupObj = []; 

          // For each skill type in the group add to temporary array... 
          for (var n in types) { 
           if (types.hasOwnProperty(n)) { 
            tempGroupObj[types[n]] = {}; 
            tempGroupObj[types[n]]['level'] = 0; 
           } 
          } 

          console.log(tempGroupObj); 

          this.skillTree[name] = tempGroupObj; 

         }).then(() => { 

         }).catch((error) => { 
          // Do error handling... 
          console.log(error); 
         }); 
        } 
       } 

       resolve(); 
      }).catch((error) => { 
       // Do error handling... 
       reject(); 
      }); 
     }); 
    } 

eveESI Provider - getSkillGroups() - returns [...]組ID的響應見的1:

 getSkillGroups(){ 
     return new Promise((resolve, reject) => { 
      this.http.get(this.apiRoot + 'universe/categories/16/', { }, { Authorization: 'Basic YWUxYmIzZDU4ZmRiNDk1ZDk3ZTE1ZTE0OTIyZDc0ZDk6MnpsVjNLZzVHbTh4OHY5b2lUSENYOHVXR21PYjlHd2Rqc3htQ0NHOA=='}) 
      .then(reqResponse => { 
       // Returns {} of skill groups from category... 
       var responseJSON = JSON.parse(reqResponse.data); 

       resolve(responseJSON.groups); 
      }).catch(reqError => { 
       // Error. Return error message... 
       reject(); 
      }); 
     }); 
    } 

eveESI提供商 - getSkillsInGroup(ID) - 的組的信息返回{...}看到響應2:

getSkillsInGroup(id){ 
     return new Promise((resolve, reject) => { 
      this.http.get(this.apiRoot + 'universe/groups/' + id + '/', { }, { Authorization: 'Basic YWUxYmIzZDU4ZmRiNDk1ZDk3ZTE1ZTE0OTIyZDc0ZDk6MnpsVjNLZzVHbTh4OHY5b2lUSENYOHVXR21PYjlHd2Rqc3htQ0NHOA=='}) 
      .then(reqResponse => { 
       resolve(reqResponse.data); 
      }).catch(reqError => { 
       // Error. Return error message... 
       reject(); 
      }); 
     }); 
    } 

響應1(列出組ID的):

{ 
    "category_id": 16, 
    "name": "Skill", 
    "published": true, 
    "groups": [ 
    255, 
    256, 
    257, 
    258, 
    266, 
    268, 
    269, 
    270, 
    272, 
    273, 
    274, 
    275, 
    278, 
    505, 
    1209, 
    1210, 
    1213, 
    1216, 
    1217, 
    1218, 
    1220, 
    1240, 
    1241, 
    1545 
    ] 
} 

響應2(返回組細節和組類型):

{ 
    "group_id": 255, 
    "name": "Gunnery", 
    "published": true, 
    "category_id": 16, 
    "types": [ 
    3300, 
    3301, 
    3302, 
    3303, 
    3304, 
    3305, 
    3306, 
    3307, 
    3308, 
    3309, 
    3310, 
    3311, 
    3312, 
    3315, 
    3316, 
    3317, 
    11082, 
    11083, 
    11084, 
    12201, 
    12202, 
    12203, 
    12204, 
    12205, 
    12206, 
    12207, 
    12208, 
    12209, 
    12210, 
    12211, 
    12212, 
    12213, 
    12214, 
    12215, 
    20327, 
    21666, 
    21667, 
    22043, 
    24563, 
    32856, 
    41403, 
    41404, 
    41405, 
    41406, 
    41407, 
    41408, 
    41537 
    ] 
} 

響應3(返回由ID類型的詳細信息):

{ 
    "type_id": 3300, 
    "name": "Gunnery", 
    "description": "Basic turret operation skill. 2% Bonus to weapon turrets' rate of fire per skill level.", 
    "published": true, 
    "group_id": 255, 
    "market_group_id": 364, 
    "radius": 1, 
    "volume": 0.01, 
    "packaged_volume": 0.01, 
    "icon_id": 33, 
    "capacity": 0, 
    "portion_size": 1, 
    "mass": 0, 
    "dogma_attributes": [...], 
    "dogma_effects": [...] 
} 

的package.json

{ 
    "name": "name", 
    "version": "0.0.1", 
    "author": "author", 
    "homepage": "http://ionicframework.com/", 
    "private": true, 
    "scripts": { 
    "clean": "ionic-app-scripts clean", 
    "build": "ionic-app-scripts build", 
    "lint": "ionic-app-scripts lint", 
    "ionic:build": "ionic-app-scripts build", 
    "ionic:serve": "ionic-app-scripts serve" 
    }, 
    "dependencies": { 
    "@angular/common": "5.0.3", 
    "@angular/compiler": "5.0.3", 
    "@angular/compiler-cli": "5.0.3", 
    "@angular/core": "5.0.3", 
    "@angular/forms": "5.0.3", 
    "@angular/http": "5.0.3", 
    "@angular/platform-browser": "5.0.3", 
    "@angular/platform-browser-dynamic": "5.0.3", 
    "@ionic-native/browser-tab": "^4.4.2", 
    "@ionic-native/core": "4.4.0", 
    "@ionic-native/deeplinks": "^4.4.2", 
    "@ionic-native/http": "^4.4.2", 
    "@ionic-native/secure-storage": "^4.4.2", 
    "@ionic-native/spinner-dialog": "^4.4.2", 
    "@ionic-native/splash-screen": "4.4.0", 
    "@ionic-native/sqlite": "^4.4.2", 
    "@ionic-native/sqlite-porter": "^4.5.0", 
    "@ionic-native/status-bar": "4.4.0", 
    "@ionic/storage": "^2.1.3", 
    "angular2-natural-sort": "0.0.2", 
    "angular2-swagger-client-generator": "0.0.22", 
    "cordova-android": "6.3.0", 
    "cordova-plugin-advanced-http": "^1.9.0", 
    "cordova-plugin-browsertab": "^0.2.0", 
    "cordova-plugin-compat": "^1.2.0", 
    "cordova-plugin-device": "^1.1.4", 
    "cordova-plugin-file": "^5.0.0", 
    "cordova-plugin-ionic-webview": "^1.1.16", 
    "cordova-plugin-native-spinner": "^1.1.3", 
    "cordova-plugin-secure-storage": "^2.6.8", 
    "cordova-plugin-splashscreen": "^4.0.3", 
    "cordova-plugin-statusbar": "^2.3.0", 
    "cordova-plugin-whitelist": "^1.3.1", 
    "cordova-sqlite-storage": "^2.1.2", 
    "ionic-angular": "3.9.2", 
    "ionic-plugin-deeplinks": "^1.0.15", 
    "ionic-plugin-keyboard": "^2.2.1", 
    "ionicons": "3.0.0", 
    "ngx-order-pipe": "^1.1.1", 
    "rxjs": "5.5.2", 
    "sw-toolbox": "3.6.0", 
    "swagger-angular-generator": "^1.2.1", 
    "uk.co.workingedge.cordova.plugin.sqliteporter": "^1.0.2", 
    "zone.js": "0.8.18" 
    }, 
    "devDependencies": { 
    "@ionic/app-scripts": "3.1.4", 
    "typescript": "2.4.2" 
    }, 
    "description": "An Ionic project", 
    "cordova": { 
    "plugins": { 
     "ionic-plugin-keyboard": {}, 
     "cordova-plugin-whitelist": {}, 
     "cordova-plugin-device": {}, 
     "cordova-plugin-splashscreen": {}, 
     "cordova-plugin-ionic-webview": {}, 
     "cordova-plugin-browsertab": {}, 
     "ionic-plugin-deeplinks": { 
     "URL_SCHEME": "_CUSTOMURLSCHEME", 
     "DEEPLINK_SCHEME": "https", 
     "DEEPLINK_HOST": "localhost", 
     "ANDROID_PATH_PREFIX": "/", 
     "ANDROID_2_PATH_PREFIX": "/", 
     "ANDROID_3_PATH_PREFIX": "/", 
     "ANDROID_4_PATH_PREFIX": "/", 
     "ANDROID_5_PATH_PREFIX": "/", 
     "DEEPLINK_2_SCHEME": " ", 
     "DEEPLINK_2_HOST": " ", 
     "DEEPLINK_3_SCHEME": " ", 
     "DEEPLINK_3_HOST": " ", 
     "DEEPLINK_4_SCHEME": " ", 
     "DEEPLINK_4_HOST": " ", 
     "DEEPLINK_5_SCHEME": " ", 
     "DEEPLINK_5_HOST": " " 
     }, 
     "cordova-plugin-secure-storage": {}, 
     "cordova-plugin-native-spinner": {}, 
     "cordova-plugin-advanced-http": {}, 
     "cordova-sqlite-storage": {}, 
     "cordova-plugin-statusbar": {}, 
     "uk.co.workingedge.cordova.plugin.sqliteporter": {} 
    }, 
    "platforms": [ 
     "android" 
    ] 
    } 
} 
+0

一些提示:添加與您可以從端點獲得的響應相匹配的接口定義。根據以前的接口添加一個接口,該接口定義要獲取的最終結果。將顯式參數和返回類型添加到提供者/服務方法。我仍然不明白爲什麼PPL使用打字稿時沒有最重要的功能... –

沙发
0
0

你應該使用因爲Observable是冷的,所以你可以創建它們,將它們存儲在一個數組中,然後再合併它們結果,以便您的http請求同時被觸發,收集您需要的所有內容的詳細信息。

這裏,在僞代碼(我將不會複製你的整個實現),可觀測鏈解決您的問題:

getSkillGroups() { 
    this.http.get(this.apiRoot + 'universe/categories/16/', {}, {Authorization: 'Basic YWUxYmIzZDU4ZmRiNDk1ZDk3ZTE1ZTE0OTIyZDc0ZDk6MnpsVjNLZzVHbTh4OHY5b2lUSENYOHVXR21PYjlHd2Rqc3htQ0NHOA=='}) 
     .switchMap(response1 => { 
      const groupsDetails: Observable<any>[] = []; 
      response1.groups.forEach(group => { 
       groupsDetails.push(this.getSkillsInGroup(group)); 
      }); 
      //This will return an array of requests ready to be fired right when you call subscribe on it 
      // When fired, the requests will be parallels, not sync. 
      return Observable.combineLatest(groupsDetails); 
     }); 
} 

getSkillsInGroup(id){ 
    return this.http.get(this.apiRoot + 'universe/groups/' + id + '/', { }, { Authorization: 'Basic YWUxYmIzZDU4ZmRiNDk1ZDk3ZTE1ZTE0OTIyZDc0ZDk6MnpsVjNLZzVHbTh4OHY5b2lUSENYOHVXR21PYjlHd2Rqc3htQ0NHOA=='}) 
     .map(response2 => response2.data); 
} 

一旦你調用getSkillGroups(),你得到的response2數組的數據,這意味着你可以添加一個新的map操作符,創建一個Observable數組來添加細節到技能。然後你可以訂閱它,你會得到技能。

我強烈建議使用,而不是承諾的大案像這樣的觀測量,如可觀察到讓你做的方式更多的事情,並沒有使用do運營商改變數據方便調試。

有關rxjs officiel documentation website的更多詳細信息。

+0

我一直完全被.map部分迷失了嗎?你能解釋它做了什麼,爲什麼它與那個不同? –

+0

主要部分是'map'不觸發observable,而。(實際上,創建promise會觸發promise)。基本上,映射操作符將輸入值轉換爲另一個(我意識到我犯了一個錯誤,應該是switchMap)。所以,map是「使用前一個操作符返回的值,返回這個值」。 switchMap更像是「使用返回值,返回這個Observable的結果」。檢查這個模式:http://reactivex.io/documentation/operators/map.html它大大有助於理解地圖。 – Supamiu

+0

現在我完全失去了:D那麼,你將如何使用.subscribe來獲得這個工作? –